我正在寻找一种方法,让 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
我尝试将 stdin 重定向到新的 fd 并read -u <fd>
在脚本内部使用 fd 为“7”的示例,如下所示:
#!/bin/bash
exec <fd><&0
exec 0<&-
...但是我不知道如何重新打开(或重置)标准输入到交互式标准输入
有任何想法吗?你们甚至认为这是可能的吗?
顺便说一句,我不是在寻找以下内容:
- 在明文中添加
input.lst
用户名和密码(也不是任何类型的密码黑客) - cat-ing 两个文件到脚本中(第一个文件以明文形式存储用户名和密码)
- 我必须使用参数来
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
您可以使用;调用它然后它打印提示并从终端读取密码,但从重定向到文件的标准输入处理循环。
我确信存在一些问题,但对于大多数情况来说它可能已经足够好了。
答案2
NickD 的回答给了我解决这个问题的见解。
这是确切规范的工作代码
#!/bin/bash
./authentication_application < /dev/tty
while read i
do
echo $i
done
希望有人觉得它有用