使用“bash 脚本”将命令发送到“应用程序的外壳”[重复]

Posted

技术标签:

【中文标题】使用“bash 脚本”将命令发送到“应用程序的外壳”[重复]【英文标题】:Sending commands to "application's shell" using "bash script" [duplicate] 【发布时间】:2021-07-23 09:34:46 【问题描述】:

我有一个程序JLinkExe 在执行时打开它自己的提示。所以我通常是这样运行的:

JLinkExe

然后在出现的提示符下键入命令:

J-Link>

有许多应用程序都有自己的提示符,我对一种通用方法很感兴趣,该方法使我能够向任何有自己提示符的应用程序发送命令。


我已经尝试了两种方法。他们都尝试按以下顺序发送命令:

    connect 输入 输入 输入 输入 erase loadbin program.bin , 0x0 r q

但两者都失败了。这是第一种方法:

    echo 'connect';
     echo '';
     echo '';
     echo '';
     echo '';
     echo 'erase';
     echo 'loadbin program.bin , 0x0';
     echo 'r';
     echo 'q';  | JLinkExe

还有第二种方法(source):

JLinkExe <<EOF
connect




erase
loadbin program.bin , 0x0
r
q
EOF

我在互联网上找到了这些方法,但我不明白为什么它们会失败。尤其是过去的第一个工作......

谁能提出更好/有效/普遍适用的方法?

【问题讨论】:

【参考方案1】:

我认为这可能是因为 here-docs 不等待输出。不幸的是,我换了公司,因此无法在下面测试我的代码。

#! /bin/bash
expect <<-EOF
    set timeout -1
    spawn JLinkExe
    expect "J-Link> "  send "connect\r" 
    expect "J-Link> "  send "\r" 
    expect "J-Link> "  send "\r" 
    expect "J-Link> "  send "\r" 
    expect "J-Link> "  send "\r" 
    expect "J-Link> "  send "erase\r" 
    expect "J-Link> "  send "loadbin program.bin , 0x0\r" 
    expect "J-Link> "  send "r\r" 
    expect "J-Link> "  send "q\r" 
    expect eof
    catch wait result
    exit [lindex \$result 3]
EOF
exit $?

除非等到J-Link&gt; 出现然后通过连接发送命令。

如果它不起作用,请通知我。周末后我会尽力帮助你:-)

编辑: A:为什么你把所有的东西都包在expect 2&gt;&amp;1 &lt;&lt;-EOFEOF 中?你可以在shebang 中添加expect,但我经常将它用作我的Bash 脚本的一部分。我对 Bash 的了解更好。

B:为什么使用 -EOF 而不是 EOF?这是因为 &lt;&lt;-EOF 在您想要结束 here-doc 时允许使用前导制表符。例如,您可以在函数中缩进它。

C:你为什么将 stderr 重定向到 stdout (2>&1)?在你的情况下,我应该删除它。我从关于期望的其他答案之一中获取了代码,并根据您的需求对其进行了定制。

D:catch wait resultexit [lindex \$result 3] 在我们捕获到 eof 后会做什么?很好的问题,我必须自己查一下这个问题:

lindex 接受\$result 中的第四个参数并退出 here-doc(0 是 arg 1)。 \$resultcatch wait result 设置。 Catch 获取wait 的输出并将其放入result Wait 返回四个整数: First:正在等待的进程的 pid。 第二个:生成 ID。 第三:-1 表示错误,0 否则。 Forth:操作系统设置的程序退出状态。 来源: https://linux.die.net/man/1/expect https://www.tcl.tk/man/tcl/TclCmd/catch.html https://www.tcl.tk/man/tcl/TclCmd/lindex.html

请注意,您必须在 here-doc 中转义 $,否则 Bash 会尝试处理它。因此\$result

E:为什么要使用 exit $ 退出?Bash 退出脚本时使用最后一个已知的错误代码。尽管您可以隐式保留它,但我还是喜欢添加它。它使脚本对初学者更具可读性。

【讨论】:

我有几个问题。您能否在问题中详细说明以下内容。 答: 你为什么把所有东西都包在expect 2&gt;&amp;1 &lt;&lt;-EOFEOF 中? B: 为什么是-EOF 而不是EOFC: 你为什么将 stderr 重定向到 stdout (2&gt;&amp;1)? D: 在我们捕捉到eof 之后,catch wait resultexit [lindex \$result 3] 会做什么? E:你为什么退出exit $?

以上是关于使用“bash 脚本”将命令发送到“应用程序的外壳”[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Bash 抑制命令的所有输出?

如何使用 mail 或 mailx 命令从 bash 脚本以 HTML 格式发送电子邮件(Centos/Redhat)

zabbix4.0-告警:配置邮件告警(bash脚本:Linux系统mail命令)

SFTP 使用 bash 脚本发送文件

通过 Bash 脚本通过 Telnet 发送命令

通过 netcat 连接并在 bash 脚本中发送命令