[server] 파이프 sudo 명령에서 비밀번호 입력이 작동하는 이유는 무엇입니까?

만약 내가한다면:

sudo cat /etc/resolv.conf | less

(아마도) stdin이 덜 걸리더라도 암호를 묻는 메시지가 나타납니다. 암호 프롬프트는 어떤 fd에 표시되며 어떻게 입력을 다시 받습니까?



답변

실제로, 일반적인 호출은 sudo암호를 전혀 읽지 않습니다 stdin. 대신에, sudo직접 액세스 제어 단자 (a 것 tty또는 pty비아,/dev/tty 특수 파일을 하여 프롬프트를 출력하고 문자를 직접 읽습니다. 이것은에서 볼 수 있습니다tgetpass.csudo 소스 파일에서 .

몇 가지 다른 시나리오가 있습니다.

  • askpass예를 들어 -A매개 변수 에 프로그램이 지정된 경우 해당 프로그램이 호출됩니다.
  • 그렇지 않으면, 예를 들어 플래그 와 같이 특별히 sudo읽기를 요청 하면 -에 프롬프트가 표시됩니다 . 이 경우가 MadHatter의 대답이 적용됩니다.stdin-Sstderr
  • 그렇지 않으면 tty사용할 수 없는 경우
    • 비밀번호 에코가 비활성화 된 경우 (기본적으로, visiblepw플래그로 제어 됨 sudoers) sudo오류가보고됩니다.no tty present and no askpass program specified
    • 그렇지 않으면 sudo사용하여 다시 떨어질 것이다 stdinstderr그것은 특별히 요청하지 않은 경우에도 마찬가지입니다. MadHatter의 답변 도 여기에 적용됩니다.

답변

파이프는 sudo catstdout을 lessstdin에 연결하므로sudo cat stdin은 영향을받지 않으며 암호를받을 수 있습니다.

프롬프트는 sudo catstderr 에서 나옵니다 . bash에서 stdout과 함께 리디렉션 해보십시오.

sudo cat /etc/resolv.conf |& less

응답이 얼마나 다른지 봅니다.


답변