我使用的是带有监视标志的autossh。每次发送测试数据包时,autossh打印到标准输出。
在expect下使用autossh时,不会打印文本数据包消息。我不知道它们是否被发送了,这对于保持ssh连接正常是很重要的。
您能看出"expect“是否会影响自动测试行为吗?如何才能确定autossh是否正确工作?
expect代码:
#!/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是否会发送它们。
谢谢。
发布于 2014-10-23 14:31:20
坦白地说,我以前没有在autossh上工作过。但是,按照您的代码,expect将检查您提供的模式,例如通过提供密码登录。如果它碰巧看到了某种错误消息。它会退出的。
然后在最后。您添加了wait。它会延迟到生成的进程(如果没有命名的话,则延迟当前进程)终止。我不知道这些印刷品是否会简单地印在终端上。在这种情况下,登录之后,您可以让expect等待它,就像登录一样。如果在提供任何类型的命令后都会看到这些打印,那么请确保您通过send传递它,然后等待这些模式。
除非指示expect对模式进行预期,否则它不会等待任何东西,这也是为什么输出中也看不到它的原因。
发布于 2014-10-24 06:21:47
我发现等待在某种程度上阻止了"autossh“监视连接。"expect“脚本末尾的”等待“被替换为”交互“,它现在运行良好。
*谢谢迪尼希
发布于 2014-11-17 09:46:25
(这是更详细的描述和答案。)
我想要的:
expect的问题:在建立ssh隧道之后,我尝试使用以下方法
解决方案是使用这个循环结束“期望”一个“连接确定”字符串。
set moreThanAutoSshTimeout [expr {$env(AUTOSSH_POLL) + 10}]
set timeout $moreThanAutoSshTimeout
set connStatus 1
while { $connStatus } {
set connStatus 0
expect \
{
"connection ok" { set connStatus 1 }
}
}https://stackoverflow.com/questions/26527186
复制相似问题