打开ssh连接冻结

时间:2014-04-03 12:16:42

标签: linux ssh tcl

我正在尝试用Tcl8.5脚本打开ssh连接,例如:

catch {set fh [open "|sshpass -p $password ssh $user@$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 $fh没有EOF。

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

$ sshpass -p abcdef ssh root@1.2.3.4
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
root@MyPC:~# 

请注意:我知道还有其他方法可以执行此操作(Expect,keys),但我必须理解为什么这种特定方法不起作用。谢谢。

1 个答案:

答案 0 :(得分: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
}