원격 서버에서 루트로 명령을 실행하고(sudo를 통해) 표준 출력(표준 오류는 아님)을 파일로 캡처하려고 합니다.
예를 들어. 이 같은:
ssh user@remote "cat /root/file.tar | gzip" > root-file.tar.gz
원격에서 루트 액세스가 필요하지 않은 경우:
ssh user@remote "sudo cat /root/file.tar | gzip" > root-file.tar.gz
비밀번호가 없으면 루트로 로그인할 수 없으므로 su
또는 를 사용할 수 없습니다 ssh root@server
.
위 명령을 시도하면 다음과 같은 결과가 나타납니다.
$ ssh user@remote "sudo cat /root/file.tar | gzip" > root-file.tar.gz
sudo: no tty present and no askpass program specified
tty를 할당하기 위해 ssh를 추가한 -t
다음 root-file.tar.gz
sudo(및 gzip이지만 --force도 가능)에서 출력을 가져오므로 원격 stdout 및 stderr을 로컬 stdout으로 캡처하는 것 같습니다.
$ ssh -t user@remote "sudo cat /root/file.tar | gzip" > root-file.tar.gz
(hangs)
$ cat root-file.tar.gz
gzip: compressed data not written to a terminal. Use -f to force compression.
For help, type: gzip -h
[sudo] password for user:
sudoer에서 NOPASSWD를 사용하여 특정 명령을 화이트리스트에 추가하고 있습니다. 이는 정기적으로 나타나는 스크립트에 적합하지만 때때로 다른 임의 명령으로 이와 같은 작업을 수행하고 싶기 때문에 NOPASSWD를 영원히 추가할 수는 없습니다. .
답변1
-S 옵션 [0]을 sudo에 전달하여 tty를 요구하지 않고 stdin에서 비밀번호를 허용할 수 있습니다.
이로 인해 비밀번호가 터미널에 에코될 수 있으므로 직접 에코를 꺼보세요.
$ stty -echo; ssh user@remote "sudo cat /root/file.tar | gzip" > root-file.tar.gz
[sudo] password for user:
$
[0] 부터맨페이지: -S(stdin) 옵션을 사용하면 sudo가 터미널 장치 대신 표준 입력에서 비밀번호를 읽습니다. 비밀번호 뒤에는 개행 문자가 와야 합니다.