【问题标题】:open ssh connection freezes打开的 ssh 连接冻结
【发布时间】:2014-05-15 06:34:48
【问题描述】:

我正在尝试使用 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:~# 

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

【问题讨论】:

  • 输出不去终端时行缓冲?
  • @DonalFellows:对不起,但不明白这个问题。
  • 许多程序在输出到管道或文件而不是终端时会改变它们的缓冲样式。我不知道这里是不是真的。 (如果你只是运行一个远程命令,你可能不需要关心。)
  • 我正在运行的唯一命令是sshpass,通过它我想在远程机器上执行许多命令。目前,我什至没有达到提示,所以我无法在远程机器上运行任何命令。你写了“我不知道这是否是真的” - 我应该如何测试?您是指sshpass 程序还是其他程序?
  • @DonalFellows:这是否相关:blog.ipspace.net/2007/10/…

标签: linux ssh tcl


【解决方案1】:

我针对我的一台服务器 Ubuntu 10.04.4 LTS 测试了您的代码,但我根本没有收到任何登录消息。

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

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

没有任何问题,而且是有道理的:您通常不需要名为 ssh 的脚本中的登录标题,而只需要命令输出。

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

顺便说一句,这样写:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-09
    • 2011-07-07
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    相关资源
    最近更新 更多