我正在使用telnet
Linux 中 Bash 终端上的命令连接到嵌入式系统上运行的固件的控制台。FW 通过控制台命令进行控制。为了方便起见,我在文本编辑器中编写了命令脚本,然后从那里剪切并粘贴行。
为了节省时间,我尝试在一次多行粘贴中粘贴多个连续命令。问题是固件的命令行处理速度比粘贴速度慢,并且序列中的第二或第三条命令的部分内容会丢失。
在不同的设置中,我使用 TeraTerm 执行了相同的操作。在那里,可以配置多行粘贴中行与行之间的暂停。
有没有办法使用telnet
Bash 命令实现相同的功能?
或者,有没有办法让 Bash 本身在粘贴 Telnet 提示时在行之间添加所需的暂停?
答案1
尝试编写一个 bash 脚本,打印 telnet 命令,并sleep
在命令之间插入命令。然后将 bash 脚本传输到您的 telnet shell。
命令
echo 'command 1'
sleep 1
echo 'command 2'
sleep 1
...
$ bash commands.sh | telnet
答案2
我的建议是完全避免粘贴,并开始使用expect
CLI 自动化。虽然它可以进行定时延迟,但它的主要功能之一是能够等待具体答复,例如+OK
或>
响应,然后继续执行下一个命令。
例如,如果设备>
在您继续之前响应提示(它可以是部分的,下面相同的示例也会匹配类似的提示Router>
),您可以:
#!/usr/bin/env expect
set host [lindex $argv 0]
spawn "telnet" $host
expect "Username:" { send "admin\n" }
expect "Password:" { send "hunter2\n" }
expect ">" { send "do_something\n" }
expect ">" { send "do_something_else\n" }
expect {
"FAILED:" { send "do_it_differently\n"; exp_continue }
">" { send "do_third_thing\n" }
}
Expect 脚本基于 Tcl,因此如果您想添加不同模式的命令行选项,请使用 Tcl 语言参考(foreach
和switch
)。另一个类似的工具是 Pexpect,它使用 Python 执行相同操作。
或者,有没有办法让 Bash 本身在粘贴 Telnet 提示时在行之间添加所需的暂停?
粘贴 Telnet 提示符不会经过 Bash。终端直接与 Telnet 对话,而 Bash 所做的唯一一件事就是等待 /usr/bin/telnet 退出。
如果不是 Telnet 本身,那么您的终端应用程序(例如 xterm 或 PuTTY)将负责添加此类延迟 - 就像您在 TeraTerm 中所拥有的选项一样。