문맥
내 서버의 백업을 설정하고 싶으 rsync
므로 다음 명령을 실행합니다.
rsync -r -e ssh --rsync-path="sudo rsync" [email protected]:/ /backup/
이상적으로는 해당 명령이 내 개인 SSH 키 비밀번호를 묻고 연결한 다음 rsyncuser에 대한 sudo 비밀번호를 묻고 서버에서 rsync를 실행합니다. 하지만 악명 높은 오류가 발생했습니다.
sudo: no tty present and no askpass program specified
/etc/sudoers
그래서 이것을 (를 사용하여 ) 에 추가해야 했는데 sudo visudo
, 이는 기본적으로 사용자에게 시스템에 대한 비밀번호 없는 전체 읽기-쓰기 액세스 권한을 제공하는데 rsyncuser
, 이는 내 취향이 아닙니다.
rsyncuser ALL= NOPASSWD:/usr/bin/rsync
질문
대신 sudo에게 다른 TTY에서 비밀번호를 읽도록 지시하려면 어떻게 해야 합니까?
그렇게 하면 로컬 컴퓨터의 한 터미널 창에서 실행 rsync
하고 다른 터미널 창을 사용하여 서버에 대한 (아마도 별도의) SSH 연결을 열고 거기에 sudo 비밀번호를 제공할 수 있습니다.
내가 생각하는 유일한 방법은 명명된 파이프에서 비밀번호를 읽는 sudo 관련 스크립트를 사용 expect
하고 다른 터미널에서 해당 파이프에 쓰는 것입니다.
참고: 이는 실제적인 목적보다는 실험과 학습을 위한 것입니다.rsync와 함께 sudo를 사용하는 방법을 찾으려는 것이 아닙니다., 나는 그것에 관해 찾을 수 있는 모든 것을 이미 읽었습니다.
답변1
sudo
SUDO_ASKPASS
귀하의 경우와 같이 터미널에서 실행되지 않거나 -A가 설정된 경우 환경 변수를 읽습니다 . 이를 암호를 얻기 위해 실행하는 명령으로 사용합니다. 예를 들어:
echo -e '#!/bin/sh\nhead -n 1' > ~/bin/reader
chmod a+x ~/bin/reader
export SUDO_ASKPASS="$HOME/bin/reader"
sudo -A echo "I'm root\!"
stdin에서 비밀번호를 묻는 메시지가 표시되며 터미널이 필요하지 않습니다.
그러나 수행하려는 작업의 특정 경우에는 SSH 키와 rsync로 제한된 명령을 사용하여 루트 SSH 로그인을 허용하는 것이 더 나을 수 있습니다. 이에 대한 좋은 자료가 있습니다여기.
답변2
노력하다:
ssh userfoo@host "sudo -S p'enter pw: ' [command] "
enter pw:
그러면 로컬 호스트/터미널에 표시되는 비밀번호 프롬프트(" ")가 표시됩니다 . 단점은 비밀번호가 터미널 창에 투명하게 표시되어 보안 위험이 있다는 것입니다. 로컬에는 저장되지 않지만 .bash_history
터미널 창 스크롤백 기록입니다. 따라서 예를 들어 Konsole을 사용하는 경우 Ctrl+ Shift+를 사용하여 K이를 지웁니다.