我有一个脚本,它运行一个生成电子邮件的程序,然后等待用户输入该电子邮件中的信息。因此,在执行时无法将信息传递给程序。它必须在它已经运行之后完成。
我已经尝试了许多不同的方法建议,重定向到终端(echo或cat> / dev / pts /#),mkfifo,expect等。这些方法中的大多数都成功地将信息发送到目标终端 - 我实际上看到信息显示在那里。但似乎没有一种方法可以发送相当于某人按下回车键的方法。
信息发送中的换行符(使用echo -en)或\ n实际上使光标在目标终端中移动 - 但它与实际按下回车不一样。它只是将屏幕向下滚动一行。如果我选择终端窗口并按回车键,则接受输入。
如何从不同的终端(或我可以?)
这样做 或者更好的是,是否有一种方法可以从同一个脚本启动程序,现在等待输入发送程序输入?
我所看到的大部分内容已经走上了使用另一个终端尝试将信息发送到程序的路线。
流量:
简单类似的示例是,如果您运行的shell脚本在执行期间运行生成发送到您的电子邮件的PIN的程序,然后在继续之前等待输入PIN。
在终端1中,运行一个bash脚本 - 该脚本执行的步骤之一是启动一个程序,该程序生成一个电子邮件,然后处于提示符,等待用户提供输入(来自发送的电子邮件的数据)。
在终端2中(或者如果您可以通过终端1以某种方式执行此操作),从电子邮件中取出值并将其输入到终端1中的程序,包括按回车键,以便程序将此值视为实际输入的和程序可以完成执行。
终端1中的
脚本:
...
if [ -f $progamToRun ]; then
$programToRun # This program sends the email and prompts the user for information from the email. It waits here...
# once information from email is entered, continue executing commands here
fi
终端2中的脚本:
...
# monitor email
# retrieve information from email
# send information to program in terminal 1 that is waiting for this input
# exit script
终端2中脚本的步骤正在运行 - 我尝试将信息发送到终端1中的程序的所有方法都没有工作 - 也就是说,即使信息通过STDIN等显示在终端中。运行的应用程序不会将其识别为输入,因此它仍然处于等待状态。
我尝试按照建议使用netcat,但这种情况有所不同。
在1号航站楼,我跑了:
cat /tmp/nctest | /tmp/docl.sh -i 2>&1 | nc -l 127.0.0.1 8080 > /tmp/nctest
docl.sh包含一行,我正在运行的应用程序生成电子邮件并等待。
在终端2中,我跑了:
nc 127.0.0.1 8080 <information from email>
当我在终端2中运行它时,我立即从终端1的脚本中运行的程序中得到错误。我试过这个:
nc 127.0.0.1 8080
单独查看在运行nc的同一行上传递信息是否有问题,但得到相同的结果。它就像第一个终端的nc命令实际运行应用程序然后以某种方式绕过或处理提示,所以在我从电子邮件输入信息之前它已经消失了。
我也在终端1中尝试了没有-i和没有2&gt;&amp; 1的命令,但是结果没有区别。