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


25

만약 내가한다면:

sudo cat /etc/resolv.conf | less

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

답변:


48

실제로, 일반적인 호출은 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의 답변 도 여기에 적용됩니다.

10

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

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

sudo cat /etc/resolv.conf |& less

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


16
이 답변이 점에서 올바른 동안 sudo의 '표준 입력은 여전히 그 암호를 얻는 방법에 직접적으로 관련이없는의 예제 명령을 터미널에 연결되어 : 기본적으로 sudo표준 입력을 통해 암호를 요구하지 않으며이를 통해 프롬프트가 표시됩니다 stderr- 당신은 2>/dev/null그것을 확인 하려고 할 수 있습니다 . 대신 sudotty에 직접 액세스합니다.
Bob
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.