Bash
有沒有辦法將標準輸入解耦成多個輸入源?
我正在尋找一種將兩個標準輸入添加到 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
希望有人覺得它有用