首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"autossh“输出在"expect”项下更改

"autossh“输出在"expect”项下更改
EN

Stack Overflow用户
提问于 2014-10-23 11:37:00
回答 3查看 603关注 0票数 0

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

在expect下使用autossh时,不会打印文本数据包消息。我不知道它们是否被发送了,这对于保持ssh连接正常是很重要的。

您能看出"expect“是否会影响自动测试行为吗?如何才能确定autossh是否正确工作?

expect代码:

代码语言:javascript
复制
#!/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

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

代码语言:javascript
复制
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是否会发送它们。

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2014-10-23 14:31:20

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

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

除非指示expect对模式进行预期,否则它不会等待任何东西,这也是为什么输出中也看不到它的原因。

票数 2
EN

Stack Overflow用户

发布于 2014-10-24 06:21:47

我发现等待在某种程度上阻止了"autossh“监视连接。"expect“脚本末尾的”等待“被替换为”交互“,它现在运行良好。

*谢谢迪尼希

票数 0
EN

Stack Overflow用户

发布于 2014-11-17 09:46:25

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

我想要的:

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

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

  1. 交互-当bash脚本在后台运行时,交互挂起,所以expect没有等待autossh,而且我无法监视autossh (没有睡眠循环)
  2. 等待--由于某种原因,它阻止了自动测试监视机制正常工作。
  3. -没什么--我只是想辞职,我不能监视autossh

解决方案是使用这个循环结束“期望”一个“连接确定”字符串。

代码语言:javascript
复制
    set moreThanAutoSshTimeout [expr {$env(AUTOSSH_POLL) + 10}]
    set timeout $moreThanAutoSshTimeout
    set connStatus 1
    while { $connStatus } {
        set connStatus 0
        expect \
        {
            "connection ok"    { set connStatus 1 }
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26527186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档