有没有办法将 stdin 解耦为多个输入源?

有没有办法将 stdin 解耦为多个输入源?

我正在寻找一种方法,让 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

希望有人觉得它有用

相关内容