Bash

有沒有辦法將標準輸入解耦成多個輸入源?

  • February 2, 2021

我正在尋找一種將兩個標準輸入添加到 bash 腳本的方法,即一個是互動式的,另一個是可以利用重定向的

假設我需要呼叫一個程序,該程序要求輸入使用者名、密碼類型的憑據,我想以互動方式提供該憑據,然後我想通過重定向提供一個 while 循環。就像是:

$> ./myscript.sh < input.lst

或者

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

在我的腳本中會有類似的東西(非常簡化):

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

如果 authentication_application 是我不擁有的二進製文件(無法訪問原始碼,也沒有自己編譯),我無法更改,也無法用任何替代身份驗證方法替換。

並且呼叫將導致

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

以互動方式輸入,內容some_user取自重定向password``input.lst

我嘗試將標準輸入重定向到一個新的 fd 並read -u <fd>在腳本中使用 fd 為“7”,例如,類似這樣的東西:

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

…但是在這裡我不知道如何將標準輸入重新打開(或重置)到互動式標準輸入

有任何想法嗎?你們甚至認為這是可能的?

順便說一句,我不是在尋找以下內容:

  • 在明文上添加input.lst使用者名和密碼(也不是任何類型的密碼破解)
  • 將兩個文件添加到腳本中(第一個以明文形式儲存使用者名和密碼)
  • 一種解決方法,我必須使用參數來get_credentials.sh傳遞使用者名和密碼而不提示使用者
  • 將文件 input.lst 作為參數傳遞給腳本並使用位置參數在 while 循環中訪問文件(這會破壞重定向輸入和利用腳本的流水線性質的目的,即$> cat input.lst | ./filter_1.sh | ./filter_2.sh |... | ./filter_n.sh

可能是這樣的:

#! /bin/bash

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

while read x ;do
echo $x
done

echo "Password was: " $pwd

你用./foo.sh < infile;呼叫它 然後它列印提示並從終端讀取密碼,但從重定向到文件的標準輸入處理循環。

我敢肯定有一些陷阱,但對於大多數情況來說它可能已經足夠好了。

NickD 的回答給了我解決這個問題的洞察力。

這是確切規範的工作程式碼

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

while read i
do
 echo $i
done

希望有人覺得它有用

引用自:https://unix.stackexchange.com/questions/632297