" autossh"输出变化在"期望"

时间:2014-10-23 11:37:01

标签: expect autossh

我正在使用带监视标志的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是否发送它们。

感谢。

3 个答案:

答案 0 :(得分:2)

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

然后在最后。你添加了wait。它会延迟,直到生成的进程(或当前进程,如果没有命名)终止。我不确定这些印刷品是否会直接印在终端上。在这种情况下,登录后,您可以让expect等待它,就像您登录时一样。如果在提供任何类型的命令后会看到这些打印,那么请确保通过它send然后等待这些模式。

除非直到你指示expect期望一个模式,否则它不会等待任何因为它也不会在输出中出现的原因。

答案 1 :(得分:0)

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

*感谢Dinesh

答案 2 :(得分:0)

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

我想要的是什么:

  1. ssh tunnel使用autossh和expect以及一个包装器bash脚本。
  2. bash脚本应该在后台运行。
  3. 当ssh退出脚本时,应该再次启动隧道。
  4. 期待的问题: 建立ssh-tunnel后,我尝试使用以下

    1. 互动 - 当bash脚本在后台运行时交互挂起,所以期望不等待自动搜索,我无法监控自动搜索(没有睡眠循环)
    2. 等待 - 由于某种原因,它阻止了自动监视监视机制正常工作。
    3. -nothing- - 期待刚退出,我无法监控自动搜索
    4. 解决方案是使用此循环结束“期待”“连接正常”字符串

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