我正在尝试用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),但我必须理解为什么这种特定方法不起作用。谢谢。
答案 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
}