ssh, su를 사용하여 세션을 유지하고 내 세션 환경에만 영향을 미치려면 어떻게 해야 합니까?

ssh, su를 사용하여 세션을 유지하고 내 세션 환경에만 영향을 미치려면 어떻게 해야 합니까?

su원격 서버(Amazon Linux 2)에 SSH를 통해 동시에 몇 가지 명령을 실행하고 다음과 같은 단일 스크립트로 SSH 세션을 유지하고 싶습니다 .

ssh -t ec2-user@$host -i $keypath \
  'sudo -iu some-user bash -c "
   echo a; 
   c(){ clear; };
   echo b; 
   "'

산출:

a
b
Connection to xx.xx.xx.xx closed.

그래서 조금씩 개선이 되면서

ssh -t ec2-user@$host -i $keypath \
  'sudo -iu some-user bash -c "
   echo a; 
   c(){ clear; };
   echo b; 
   bash -l;
   echo c; 
   "'

산출:

a
b  

(이후 SSH를 통해 some-user 사용자로 원격에 로그인하고 세션을 유지하는 데 성공했습니다.)

하지만,

# on the remote
$ whoami
some-user
$ c  
bash: c: command not found  

cSSH를 통해 사용자: some-user로 로그인한 후 명령이 작동하기를 원합니다 .
이 문제를 어떻게 해결할 수 있나요?

참고:
1.
bash -lSSH 세션을 활성 상태로 유지하십시오. 삭제하면 SSH 로그아웃됩니다.
2.
다른 사람의 SSH 세션이 아닌 내 SSH 세션에만 영향을 미치고 싶기 때문에 ~/.bashrc와 같은 초기화 파일을 편집하고 싶지 않습니다.
3. SSH 로그인 후에
는 할 수 있습니다 alias c=clear. 하지만 10개의 (기능적) 별칭을 설정하고 10개의 다른 리모컨이 있으면 번거롭습니다.
4.
원격 셸은 /bin/bash입니다.

답변1

귀하의 예에서는 앨리어싱이 작동하거나 작동하지 않는다는 것을 보여주지 않습니다. 실제로 작동할 수도 있지만 알 수 없으며 어쨌든 거기에서는 쓸모가 없습니다.

Alias는 현재 쉘에 대한 쉘 별칭을 설정하는 데 사용되는 쉘 내장 명령입니다. 쉘의 메모리를 제외한 어느 곳에도 별칭을 저장하지 않습니다.

새 셸을 시작하면 다른 셸 인스턴스의 별칭을 기억하지 않습니다. 셸 전체에서 별칭을 기억하려면 해당 별칭이 셸 초기화 파일 중 하나에 있어야 합니다.

설상가상으로 이와 같은 명령은 비대화형으로 실행되며 많은 쉘 초기화 파일이 비대화형 쉘의 별칭을 로드하도록 구성되어 있지 않습니다. 또한 쉘이 로드하는 초기화 파일은 이것이 로그인 쉘인지, 서브 쉘인지, 임시 비반복 쉘인지에 따라 달라집니다. 또한 셸 옵션은 init 파일 로드를 명시적으로 비활성화할 수 있습니다. 따라서 비대화형 셸에서 별칭을 사용할 수 있도록 하려면 별칭을 생성하는 셸 초기화 파일에 주의해야 합니다.

이 조합에 sudo를 추가하면 상황이 더욱 혼란스러워집니다. 루트 쉘에서 이 별칭을 사용하시겠습니까? 그런 다음 루트의 쉘 초기화 파일에 위치해야 합니다.

bash의 Linux 기본 쉘이 대화형 쉘이라고 가정하면 ~/.bashrc별칭을 사용하려는 모든 사용자(루트 포함)는 별칭을 사용할 수 있습니다.

답변2

별칭은 까다롭습니다. 관련 부분 은 다음과 같습니다 man bash(강조).

별칭의 정의 및 사용에 관한 규칙은 다소 혼란스럽습니다. Bash는 해당 줄이나 복합 명령에서 명령을 실행하기 전에 항상 입력의 완전한 한 줄과 복합 명령을 구성하는 모든 줄을 읽습니다. 별칭은 명령이 실행될 때가 아니라 명령을 읽을 때 확장됩니다. 따라서 다른 명령과 같은 줄에 나타나는 별칭 정의는 다음 입력 줄을 읽을 때까지 적용되지 않습니다.. 줄에서 별칭 정의 뒤에 오는 명령은 새 별칭의 영향을 받지 않습니다. 이 동작은 함수를 실행할 때도 문제가 됩니다. 별칭은 함수 정의 자체가 명령이기 때문에 함수가 실행될 때가 아니라 함수 정의를 읽을 때 확장됩니다. 결과적으로
함수 내에 정의된 별칭은 함수가 실행된 후에만 사용할 수 있습니다. 안전을 위해 항상 별칭 정의를 별도의 줄에 배치하고 복합 명령에 별칭을 사용하지 마십시오.

거의 모든 목적에서 별칭은 쉘 함수로 대체됩니다.

즉, 여기와 같이 비대화형 셸에서 별칭을 사용하려면 다음을 사용하여 별칭을 명시적으로 활성화해야 합니다.shopt -s expand_aliases 그리고별칭 정의를 별도의 줄에 입력해야 합니다. A는 ;그것을 자르지 않을 것입니다. 실제 줄 바꿈이 필요합니다.

## fails
$ ssh localhost 'alias ff="echo \"I am an alias!\""; ff'
bash: line 1: ff: command not found

## fails
$ ssh localhost 'alias ff="echo \"I am an alias!\""; shopt -s expand_aliases; ff'
bash: line 1: ff: command not found

## works
$ ssh localhost 'alias ff="echo \"I am an alias!\""; shopt -s expand_aliases; 
> ff'
I am an alias!

이것은...당신이 원하는 것이 아닐 것 같습니다. 첫째, 솔직히 말해, 여러분이 해야 할 일은 이 매우 복잡한 방법을 다루기보다는 이러한 모든 명령을 스크립트에 넣고 해당 스크립트를 실행하는 것 같습니다. 이 작업을 고집한다면 최소한 별칭 대신 함수를 사용하세요.

$ ssh localhost 'ff(){ echo "I am a function!";}; ff'
I am a function!

이것이 얼마나 쉬운지 보시겠습니까?

이제 귀하가 설명하는 오류와 동작은 귀하가 제공한 명령과 일치하지 않습니다. 그러나 표시된 명령을 실행하려면 함수를 사용하여 다음과 같은 작업을 수행할 수 있습니다.

ssh -t ec2-user@$host -i $keypath \
  'sudo -iu some-user bash -c "mkdir -p /tmp/test/; cd /tmp/test ; 
   echo THIS_IS_TEST; 
   c(){ clear; }
   touch test-txt; 
   c"'

이 경우에는 말이 안 되기 때문에 여전히 말이 안 됩니다 . 아무 것도 할 수 없다는 의미이기 때문에 clear제거했습니다 . bash -l나는 당신이 아마도 새로운 질문을 하고 여기서 최종 목표가 무엇인지 설명해야 한다고 생각합니다. 어떤 작업을 수행하든 이것이 최선의 접근 방식은 아닐 수 있으므로 새로운 질문을 하고 세부 정보를 제공해 주시면 더 나은 접근 방식을 제공할 수 있을 것입니다.

답변3

작업 제어를 활성화해야 할 것 같아요

#! /bin/bash

set -m

기본적으로 활성화되어야 하지만 왜 그런지는 잘 모르겠습니다.

관련 정보