다음은 tar를 통해 파일을 전송하지만 원격 호스트에서 sudo에 암호를 전달하는 것을 지원하는 Willie Wheeler의 답변 수정 버전입니다.
(stty -echo; read passwd; stty echo; echo $passwd; tar -cz foo.*) \
| ssh remote_host "sudo -S bash -c \"tar -C /var/www/ -xz; echo\""
약간의 추가 마법은 sudo하는 -S 옵션입니다. sudo 매뉴얼 페이지에서 :
-S, --stdin 프롬프트를 표준 오류에 기록하고 터미널 장치를 사용하는 대신 표준 입력에서 암호를 읽습니다. 비밀번호 뒤에 줄 바꿈 문자가 와야합니다.
이제 tar의 출력을 ssh로 파이프하고 ssh의 stdin을 tar의 stdout으로 리디렉션하여 대화식 터미널에서 암호를 sudo로 전달하는 방법을 제거합니다. (우리는 원격 끝에 sudo의 ASKPASS 기능을 사용할 수 있지만 또 다른 이야기입니다.) 우리는 암호를 미리 캡처하고 서브 쉘에서 해당 작업을 수행하고 ssh에 서브 쉘. 이것은 또한 대화식 쉘에 암호 매달려있는 환경 변수를 남기지 않는 이점이 있습니다.
프롬프트를 인쇄하기 위해 -p 옵션으로 '읽기'를 실행하지 않은 것을 알 수 있습니다. sudo의 비밀번호 프롬프트가 ssh를 통해 대화식 쉘의 stderr로 편리하게 전달되기 때문입니다. "sdo가 파이프 오른쪽의 ssh 내부에서 실행 중일 때 sudo가 어떻게 실행되고 있습니까?" 여러 명령을 실행하고 하나의 출력을 다른 명령으로 파이프하면 부모 셸 (이 경우 대화식 셸)은 이전 명령을 실행 한 직후에 각 명령을 순서대로 실행합니다. 파이프 뒤의 각 명령이 실행될 때 부모 쉘은 왼쪽 stdout을 오른쪽 stdin에 연결 (리디렉션)합니다. 그러면 프로세스를 통과 할 때 출력이 입력이됩니다.
$ (stty -echo; read passwd; stty echo; echo $passwd; tar -cz foo.*) | ssh
remote_host "sudo -S bash -c \"tar -C /var/www/ -xz; echo\""
[sudo] password for bruce:
[1]+ Stopped ( stty -echo; read passwd; stty echo; echo
$passwd; tar -cz foo.* ) | ssh remote_host "sudo -S bash -c \"tar -C
/var/www/ -xz; echo\""
$ pstree -lap $$
bash,7168
├─bash,7969
├─pstree,7972 -lap 7168
└─ssh,7970 remote_host sudo -S bash -c "tar -C /var/www/ -xz; echo"`
대화식 쉘은 PID 7168이고 서브 쉘은 PID 7969이며 ssh 프로세스는 PID 7970입니다.
유일한 단점은 sudo가 프롬프트를 다시 보낼 시간이 있기 전에 read가 입력을 받아들이는 것입니다. 빠른 연결 및 빠른 원격 호스트에서는이를 알지 못하지만 둘 중 하나가 느릴 수 있습니다. 지연이 발생해도 프롬프트를 입력하는 기능에는 영향을 미치지 않습니다. 입력을 시작한 후에 나타날 수 있습니다.
참고 : 데모 용 로컬 컴퓨터에 "remote_Host"에 대한 호스트 파일 항목을 추가했습니다.