stdin을 여러 입력 소스로 분리하는 방법이 있습니까?

stdin을 여러 입력 소스로 분리하는 방법이 있습니까?

Bash 스크립트에 두 개의 표준 입력(예: 대화형 입력과 리디렉션을 활용할 수 있는 입력)을 갖는 방법을 찾고 있습니다.

사용자 이름과 비밀번호 유형 자격 증명을 요청하는 프로그램을 호출해야 하고 해당 자격 증명을 대화형으로 제공하고 리디렉션을 통해 while 루프를 제공하고 싶다고 가정해 보겠습니다. 그것은 다음과 같습니다:

$> ./myscript.sh < input.lst

또는

$> cat input.lst | ./myscript.sh

내 스크립트에는 다음과 같은 내용이 있습니다(매우 간단함).

#!/bin/bash
./authentication_application
while read i
do 
  echo $i
done 

여기서 인증_application은 내가 소유하지 않은 바이너리이며(소스 코드에 액세스할 수 없고 직접 컴파일하지 않음) 대체 인증 방법으로 변경하거나 대체할 수 없습니다.

전화하면 다음과 같은 결과가 발생합니다.

Username: some_user
Password: password 
... contents of input.lst ...

some_user리디렉션을 통해 얻은 대화형 입력 및 password콘텐츠input.lst

read -u <fd>stdin을 새 fd로 리디렉션하고 다음과 같이 스크립트 내에서 fd를 "7"로 사용하는 예제를 사용해 보았습니다 .

#!/bin/bash
exec <fd><&0
exec 0<&-

...하지만 stdin을 대화형 stdin으로 다시 여는(또는 재설정하는) 방법을 모르겠습니다.

어떤 아이디어가 있나요? 여러분은 이것이 가능하다고 생각하시나요?

그런데, 나는 다음을 찾고 있지 않습니다:

  • 일반 텍스트로 input.lst사용자 이름과 비밀번호를 추가하세요(어떤 종류의 비밀번호 해커도 해당되지 않음).
  • 두 개의 파일을 스크립트에 포함(첫 번째 파일은 사용자 이름과 비밀번호를 일반 텍스트로 저장함)
  • get_credentials.sh해결 방법 사용자에게 메시지를 표시하지 않고 매개변수를 사용하여 사용자 이름과 비밀번호를 전달해야 합니다.
  • input.lst 파일을 스크립트에 인수로 전달하고 위치 인수를 사용하여 while 루프에서 파일에 액세스합니다(이는 입력을 리디렉션하고 스크립트의 파이프 특성을 활용하려는 목적을 상실합니다. 즉, $> cat input.lst | ./filter_1.sh | ./filter_2.sh |... | ./filter_n.sh).

답변1

어쩌면 다음과 같은 것일 수도 있습니다.

#! /bin/bash

echo -n "Password: "
read pwd < /dev/tty
echo

while read x ;do
echo $x
done

echo "Password was: " $pwd

./foo.sh < infile; 로 호출하면 프롬프트를 인쇄하고 터미널에서 비밀번호를 읽지만 파일로 리디렉션된 stdin의 루프를 처리합니다.

몇 가지 문제가 있다고 확신하지만 대부분의 상황에서는 충분할 것입니다.

답변2

NickD의 답변은 나에게 이 문제를 해결할 수 있는 통찰력을 제공했습니다.

정확한 사양에 대한 작업 코드는 다음과 같습니다.

#!/bin/bash
./authentication_application < /dev/tty

while read i
do
  echo $i
done

누군가가 유용하다고 생각하기를 바랍니다.

관련 정보