프로세스 교체 시 비밀번호를 안전하게 읽어오시겠습니까?

프로세스 교체 시 비밀번호를 안전하게 읽어오시겠습니까?

관련된:

위의 질문을 읽었지만 여전히 필요한 작업을 수행하는 방법을 모르겠습니다.

getreport다음을 수행하기 위해 호출할 바이너리 명령이 있습니다 .

  1. 비밀번호 프롬프트(stderr로 전송된 프롬프트)
  2. 표준 입력에서 비밀번호를 읽습니다.
  3. 대량의 데이터를 표준 출력으로 인쇄합니다.

호출할 첫 번째 명령의 출력을 구문 분석하는 또 다른 이진 명령이 있습니다 processreport. 그러나 stdin에서는 작동하지 않습니다. 명령줄에 플래그로 -i지정된 파일 만 허용하고 처리합니다. 파일에서 읽고, 읽은 데이터를 사용하여 작업을 수행하고, 해당 작업에 대한 데이터를 출력합니다. (이 processreport명령은반품와 완전히 독립적으로 비밀번호를 묻는 메시지를 표시합니다 getreport. )

.getreport

그것은 다음과 같습니다:

processreport -i <(getreport)

getreport그런데 어떻게 읽는지 모르겠어요터미널에서비밀번호가 필요합니다.

가능합니까?

답변1

{ getreport | 4<&0 <&3 processreport -i /dev/fd/4; } 3<&0

항상 명시적으로 읽으려면 다음을 수행하십시오 /dev/tty.

getreport | 3<&0 </dev/tty processreport -i /dev/fd/3

...또는 더 간단하게, stderr이 항상 stdin과 동일하다는 것을 안다면 - 일반적으로 터미널에서 그렇듯이...

getreport | 3<&0 <&2 processreport -i /dev/fd/3

답변2

getreport백그라운드 프로세스이므로 터미널에서 읽을 수 없습니다.

man 2 read:

EIO: 입력/출력 오류입니다.
예를 들어, 프로세스가 백그라운드 프로세스 그룹에 있을 때 제어 터미널에서 데이터를 읽으려고 시도하고 SIGTTIN이 무시되거나 차단되거나 해당 프로세스 그룹이 분리된 경우 이러한 현상이 발생할 수 있습니다.

쉘 래퍼 없이는 원하는 것이 불가능하다고 생각합니다. 하지만 어쩌면 이것이 당신이 원하는 것에 더 가까울 수도 있습니다.

mkfifo fifo; read -p "Input for FIFO: " input; echo "$input">fifo &
cat <(read bginput <fifo; echo "$bginput"); rm fifo

이는 잘못된 비밀번호 및 읽기 재시도에는 분명히 적용되지 않습니다.

mkfifo fifo; read -p "Input for FIFO: " input; echo "$input">fifo &
processreport -i <(getreport <fifo); rm fifo

관련 정보