
SSH를 사용하여 "USER1" 서버에서 "USER2" 사용자로 다른 서버로 이동하려고 합니다.
ssh -t $hostname "sudo su - USER2; whoami; pwd"
위 명령을 실행한 후 USER2로 서버에 성공적으로 이동할 수 있었지만 뒤에 오는 명령(예: "whoami 및 pwd")은 실행되지 않았습니다. 그러나 ssh 세션을 종료하면 출력에 USER1이 나타나고 그 뒤에 현재 작업 디렉터리가 나타납니다.
SSH 알려진 호스트 파일을 변경하고 싶지 않습니다.
답변1
sudo su - USER2; whoami; pwd
원격 호스트에서 명령을 실행하고 있습니다 . 분석해 보겠습니다.
- 세미콜론으로 구분된 명령은 순차적으로 실행됩니다. 따라서 명령이
sudo su - USER2
먼저 실행된 다음 완료되면whoami
실행되고 마지막으로pwd
실행됩니다. - 이 명령은
sudo su - USER2
사용자 USER2로 로그인 쉘을 시작합니다. 쉘은 종료하라는 명령을 받을 때까지(예:exit
내장 사용) 또는 표준 입력에서 파일 끝을 감지할 때까지 표준 입력에서 명령을 읽습니다. 표준 입력은 터미널에 연결되어 있으므로 사용자가 명령을 입력할 때까지 기다립니다.
USER2로 명령을 실행하려면 해당 명령을 인수로 전달해야 합니다 sudo
. su
여기서 실행은 소용이 없습니다. sudo는 이 작업을 수행하는 방법을 이미 알고 있습니다. -t
원격 명령(Sudo 비밀번호 입력 포함)과 상호 작용하려는 경우가 아니면 SSH 옵션이 필요하지 않습니다.
ssh -t "$remotehost" 'sudo -i -u USER2 sh -c "whoami; pwd"'
sudo 구성이 임의 사용자가 아닌 루트로만 프로그램을 실행할 수 있도록 허용하는 경우(보안에 대해서는 아무 것도 변경되지 않음) sudo su
이 경우 -c
옵션을 su
지정된 쉘 명령 실행 에 전달해야 합니다. .
ssh -t "$remotehost" 'sudo su -c "whoami; pwd" USER2'
사용자의 를 읽어야 하는 경우 .profile
명시적으로 읽어야 합니다.
ssh -t "$remotehost" 'sudo su -c ". ~/.profile; whoami; pwd" USER2'
또는 명령을 대화형 쉘에 표준 입력으로 전달할 수 있습니다. SSH의 표준 입력은 터미널에 남아 있어야 하기 때문에 파이핑이 약간 까다롭습니다. 여기에 문서화된 이 접근 방식을 사용하는 이점은 셸 명령에서 인용이 상대적으로 간단하다는 것입니다. 즉, 원격 셸의 경우 '
이스케이프가 필요하지 않습니다.'\''
ssh -t "$remotehost" 'sudo su - USER2 <<\EOF
whoami
pwd
EOF'