【问题标题】:Telnet Automation with Expect: Slow authentication?使用 Expect 进行 Telnet 自动化:身份验证速度慢?
【发布时间】:2011-08-21 01:36:13
【问题描述】:

我正在使用 Telnet 向 Mikrotik 路由器发送命令。

telnet 192.168.100.100 -l admin
Password: pass1234
[admin@ZYMMA] > /interface pppoe-server remove [find user=aspeed13]
[admin@ZYMMA] > quit

效果很好。

现在我想使用 expect tcl 脚本来自动化它:

#!/usr/bin/expect --
spawn telnet 192.168.100.100
expect "Login:"
send "admin\r"
expect "Password:"
send "pass1234\r"
expect "\[admin@ZYMMA\] >"
send "/interface pppoe-server remove \[find user=aspeed13\]\r"
expect "\[admin@ZYMMA\] >"
send "quit\r"

它可以工作,但在身份验证后(第 6 行:send "pass1234\r"),当路由器 CLI 加载时,它会冻结约 10 秒,并带有以下字符 ^[[?6c^[[24;3R 然后脚本运行正常。

我的问题是为什么 Telnet 在手动访问时加载速度很快,而通过期望脚本访问时需要太多时间?我在有关 telnet 自动化的论坛上读到,他们说 telnet 很慢,但是由于手动速度太快,为什么要花时间加载期望?

【问题讨论】:

  • expecttcl,而不是 bash
  • 如果将下一行 expect 替换为 expect -re ">" 是否有效?
  • 感谢 ninjalj 的更正。
  • 关于用 expect -re ">" 替换下一行我试过了,但是脚本停止了,它一直等到超时。还有其他建议吗?
  • exp_internal 1 添加到脚本的顶部以查看 expect 是如何尝试匹配的

标签: authentication tcl telnet expect


【解决方案1】:

您看到的是终端协商的反作用,这是因为您没有在 真正的终端中运行。 (严格来说,你是——这是期望的魔力——但它的行为不像普通终端那样。)

最简单的解决方法是在生成telnet 会话之前将终端设置为其他内容,例如:

#!/usr/bin/expect --
set env(TERM) dumb
spawn telnet 192.168.100.100
# Rest of your script goes here ...

或者,您可以尝试正确响应进入 VT102 模式的请求和光标位置的报告(感觉需要做很多工作),或者您可以重写代码,以便它在 interact 中执行所有操作(它将另一端与您在其中运行的真实终端连接)。但是,如果设置环境变量可以解决问题,为什么还要麻烦?

(注意:我建议在这里将终端设置为dumb,但关键是您需要最愚蠢的终端。愚蠢的终端是理想的,因为它们几乎是完全愚蠢的,很容易伪装成他们……)

【讨论】:

  • 我试过set env(TERM) dumb没有成功,仍然连接延迟是一样的:(
  • 你认为使用 ssh 可能比 telnet 更快,还是一样。例如,是否有可能:使用 telnet(或 ssh?)在不到 3 秒的时间内打开/发送命令/关闭?
  • @Naim:根据我的经验,我猜它差不多,足以让没有理由运行不安全。 (我喜欢能够使用加密密钥进行身份验证,这实际上让我在实践中更快。)
  • 谢谢@Donal:关于安全问题,您绝对是对的。我之所以强调低响应时间是因为该脚本将由 php 网页调用。我尝试了 phpTelnet,但它几乎需要同样的时间(多一点)。所以实际上我通过转移到期望脚本只获得了几秒钟。我尝试了带有 Net::Telnet 类的 perl 脚本,我获得了更多的时间,整个过程需要 10 秒。因此,似乎不可能通过低于 10 秒阈值的脚本进行终端连接。你同意,还是我错了?
  • 使用 ssh,您还可以将要执行的命令和参数作为 ssh 的参数传递。使用 cryptokeys 和 sshagent 或者只有一个没有密码的密钥会容易得多:只需执行 ssh admin@192.168.100.100 /bin/bash -c "/interface pppoe-server remove [find user=aspeed13]" - 假设远程 shell 是 bash。 (这样你就不会延迟发送东西,等待响应,发送......)
【解决方案2】:

我的回答可能为时已晚。这是“Telnet 自动配置命令”...我就是这个问题,在 Mikrotik Wiki 上找到了这个解决方案:

在登录名后加+t。此开关自动检测为关闭。

示例: 发送“admin+t\r”

效果很好,登录后不会“等待 cca 10 秒”。

有更多“开关”的 Mikrotik WiKi 帮助链接: http://wiki.mikrotik.com/wiki/Manual:Console_login_process#FAQ

P.S.:对不起我的英语。

【讨论】:

    【解决方案3】:

    您是否尝试过启用 telnet 仿真的 netcat?

    【讨论】:

    • 你认为 netcat 会比预期更有用吗?我会阅读它,但如果你能提供一个小样本,我将不胜感激
    • 据我了解,期待和互动是要走的路。我不知道 netcat 有脚本功能..
    【解决方案4】:

    回答有点晚了。
    但是如果你想用 expect 来加快你的字符输入。
    尝试使用“autoexpect”命令生成脚本,这将保存
    在同一目录中名为“script.exp”的文件中进行交互
    你运行了命令。

    例如:
    cd $HOME
    自动期待 telnet 192.168.100.100
    # 这里还有一些 telnet 命令
    退出

    以上所有命令都会保存在~/script.exp
    关于Tcl,不知道这个脚本能不能通过tcl运行。

    【讨论】:

      猜你喜欢
      • 2015-12-10
      • 2011-12-23
      • 2012-01-06
      • 2015-11-26
      • 2019-12-14
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2020-04-06
      相关资源
      最近更新 更多