在启动的 telnet 会话中使用期望脚本

Posted

技术标签:

【中文标题】在启动的 telnet 会话中使用期望脚本【英文标题】:Using expect script inside started telnet session 【发布时间】:2019-08-22 10:21:16 【问题描述】:

我正在使用一个期望脚本与 telnet 会话进行交互,该会话之前从 bash 开始。该脚本不侦听命令行中的符号。它只是在超时用完后发送命令。我敢肯定,我在expect () 中输入了正确的符号,因为脚本在我独立运行时有效。

我有要发送到 mikrotik 的命令列表(每行 1 个命令)。我的期望脚本将每个命令放在同一行,然后脚本将它们发送。我用; 分隔命令并且它工作,但只是一个简短的命令。所以我决定用命令将文件分隔成更小的文件。然后我打开 telnet 会话(在 bash 中)并启动期望脚本,该脚本会打开较小的文件并一遍又一遍地发送命令。所以我不需要一遍又一遍地重新启动同一个会话。问题是,expect 脚本在收到等待符号时不发送命令,但在超时后发送命令。

这是 bash 脚本的一部分。在 Expect 中执行整个脚本可能更容易,但我还没有添加循环和 if 条件,当我尝试创建一些 while 或 if 结构时,我失败了。

        (
        echo open "12.12.13.44"
        sleep 2
        echo "admin+t"
        sleep 2
        echo "admin"
        sleep 2
        /usr/bin/expect /home/toor/expect2.sh
        ) | telnet

这是预期的符号

expect "> "

这里是expect脚本的一部分,它将所有命令放在同一行(没有sleep 1命令,脚本在读取文件的过程中发送quit

set timeout 1
set fid [open /home/toor/file.txt]
set content [read $fid]
close $fid

set records [split $content "\r"]

foreach record $records 
   lassign $records \
         commands
   expect "> "
   send  "$commands\r"

sleep 1
expect "> "
send "quit\r"

我将不胜感激任何关于我的期望符号问题以及写入同一行的建议。

【问题讨论】:

【参考方案1】:

您正在将expect输出 传送到telnet;在这种情况下,expect 无法从telnet 进程接收信息。

我会将其作为expect 脚本链来处理 - 编写一个启动会话的脚本,然后将控制权移交给您现有的脚本。

【讨论】:

以上是关于在启动的 telnet 会话中使用期望脚本的主要内容,如果未能解决你的问题,请参考以下文章

将 telnet 会话记录为后台进程

Bash 和期望:无法通过 telnet 重新启动路由器

如何使用 Expect 自动化 telnet 会话?

在 telnet 会话中使用变量

有没有办法将 telnet 会话输出作为邮递员测试脚本的一部分?

当我在脚本中使用它时,无法关闭带有 echo "^]" 的 scpi(telnet) 会话