【发布时间】: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/…?