【问题标题】:"autossh" output change under "expect"“期望”下的“autossh”输出变化
【发布时间】:2014-11-17 18:56:26
【问题描述】:

我正在使用带有监控标志的 autossh。每次发送测试数据包时,autossh 都会打印到标准输出。

在期望下使用 autossh 时,不会打印文本包消息。 我不知道它们是否已被发送,这对于保持 ssh 连接处于活动状态很重要。

你能判断“预期”是否会影响 autossh 行为吗? 如何判断 autossh 是否正常工作?

期望代码:


#!/usr/bin/expect
set timeout 50
spawn autossh -M 11111 -N -R 4848:localhost:80 user@192.168.1.100
set keepRunning 1
while {$keepRunning} {      
    expect \
    {
        "(yes/no)"    { send "yes\r" }  
        "Password:*"  { send "1234\r" ; set keepRunning 0 }

        "ssh exited prematurely with" { exit 7 }
        "remote port forwarding failed*"  { exit 8 }
    }
}
expect \
{
    "remote port forwarding failed*"  { exit 9 }
    "Password:*"  { exit 5 }
}
wait

我没有预料到的周期性输出是这样的:

autossh[2882]: checking for grace period, tries = 0
autossh[2882]: starting ssh (count 1)
autossh[2883]: execing /pfrm2.0/bin/ssh
autossh[2882]: ssh child pid is 2883
autossh[2882]: check on child 2883
autossh[2882]: set alarm for 50 secs
Password: autossh[2882]: connection ok
**autossh[2882]: check on child 2883
autossh[2882]: set alarm for 60 secs
autossh[2882]: connection ok
autossh[2882]: check on child 2883
autossh[2882]: set alarm for 60 secs**

最后5行是autossh发送的测试包。 仅当直接从 bash 运行 autossh 时才会打印这些行。 当使用“expect”运行时,这些行不会被打印出来,我不知道 autossh 是否发送它们。

谢谢。

【问题讨论】:

  • 你能把你试过的代码贴出来吗?
  • 我已经在原始消息中添加了代码。谢谢。

标签: expect autossh


【解决方案1】:

坦率地说,我以前没有在autossh 上工作过。但是,根据您的代码,expect 将检查您提供的模式,例如通过提供密码登录。如果它碰巧看到某种错误消息。它会退出。

然后在最后。您已添加wait。它会延迟,直到一个衍生的进程(或当前进程,如果没有被命名)终止。我不确定这些打印是否会简单地打印在终端中。在这种情况下,登录后,您可以让expect 等待它,就像您登录时所做的那样。如果在提供任何类型的命令后会看到这些打印,那么请确保您通过@987654325 传递它@ 然后等待这些模式。

除非你指示 expect 期待一个模式,否则它不会等待任何东西,这就是为什么它也不会在输出中看到。

【讨论】:

  • 感谢您的回答。我不需要文本本身,它只是表明“autossh”运行正常。我使用“等待”来监控 autossh 宕机。
【解决方案2】:

我发现等待以某种方式阻止“autossh”监视连接。 “expect”脚本末尾的“wait”被替换为“interact”,现在可以正常工作了。

* 谢谢迪内什

【讨论】:

  • 太好了,奥兹玛。 wait 只会等待 autossh 关闭。早些时候我以为我试图关闭它并等待它。
【解决方案3】:

(这是更详细的描述和答案。)

我想要的:

  1. ssh 隧道使用 autossh 和 expect 以及包装器 bash 脚本。
  2. bash 脚本应该在后台运行。
  3. 当 ssh 退出脚本时,应该再次启动隧道。

expect 的问题: 建立 ssh 隧道后,我尝试使用以下方法

  1. interact - 当 bash 脚本在后台运行时 interact 挂起,因此 expect 没有等待 autossh,我无法监控 autossh(没有睡眠循环)
  2. 等待 - 由于某种原因,它阻止了 autossh 监控机制正常工作。
  3. -nothing-- 期望只是退出,我无法监控 autossh

解决方案是使用此循环结束“期望”“连接正常”字符串

    set moreThanAutoSshTimeout [expr {$env(AUTOSSH_POLL) + 10}]
    set timeout $moreThanAutoSshTimeout
    set connStatus 1
    while { $connStatus } {
        set connStatus 0
        expect \
        {
            "connection ok"    { set connStatus 1 }
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    • 2012-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多