2014-04-03 72 views
0

我试图打开与TCL8.5脚本的东西,如SSH连接:开放ssh连接冻结

catch {set fh [open "|sshpass -p $password ssh [email protected]$ip" w+]} catch_output 

if {[info exists fh] != 1} { 
    puts "err - $catch_output" 
    return 0 
} 
fconfigure $fh -buffering none -blocking 0 

set i 0 
while {1} { 
    puts "iteration $i." 
    set data [read -nonewline $fh] 
    append input_sum $data       

    puts -nonewline $data 

    after 1000 
    incr i 
} 

但只有文字,我从远程计算机得到的是:

Welcome to Ubuntu 12.04.4 LTS (GNU/Linux 3.5.0-45-generic i686) 

* Documentation: https://help.ubuntu.com/ 

这是它挂起的地方... 变量$i有助于确保代码正在运行。
我已经确认没有EOF命令eof $fh

当我手动执行此,我得到(密码,用户& IP地址都是虚构的):

$ sshpass -p abcdef ssh [email protected] 
Welcome to Ubuntu 12.04.4 LTS (GNU/Linux 3.5.0-45-generic i686) 

* Documentation: https://help.ubuntu.com/ 

Last login: Thu Apr 3 11:22:33 2014 from 5.6.7.8 
[email protected]:~# 

请注意:我知道有其他的方法来执行这一(期望,键),但我必须明白为什么这个特定的方法不起作用。谢谢。

+0

行缓冲时输出不会到终端? –

+0

@DonalFellows:对不起,但不明白这个问题。 – Dor

+0

_Many_程序在输出到管道或文件而不是终端时更改其缓冲样式。我不知道这里是否属实。 (如果你只是运行一个远程命令,你可能不需要关心。) –

回答

0

我测试了你的代码对我的一个服务器,Ubuntu 10.04.4 LTS,我根本没有登录消息。

然后我在fconfigure之后添加了一个puts $fh "ls -l",文件列表出现在消息“迭代2”之后。

所以你的问题只是取决于通话环境的ssh的不同行为。

没有什么错误,它是有道理的:你通常不希望登录标题在一个名为ssh的脚本中,而只是命令输出。

虽然我没有通过广泛的配置和命令行选项工作。而且我的机器上没有sshpass,我只是通过ssh-agent使用ssh进行身份验证。

顺便说一句,写这样的渔获:

if {[catch {mycommand param1} catchres]} then { 
    puts stderr $catchres 
} else { 
    # no error, contine 
}