2016-01-24 234 views
1

我在写一个expect脚本,它使用ssh在远程服务器上执行命令。期望ssh脚本(在远程计算机上执行命令)

命令语法:ssh <classname> <command>

代码:

set ip "hive28.cs.berkeley.edu" 
set class [lindex $argv 0] 
// set $user and $ip according to class 

set cmd [lindex $argv 1] 
spawn ssh "$user\@$ip '$cmd'" 
expect "assword" 
send "$password\r"; 
interact 

不幸的是,我得到这个错误:

~/foo> ssh2 162 'pwd' 

spawn ssh ***@hive28.cs.berkeley.edu 'pwd' 
ssh: Could not resolve hostname hive28.cs.berkeley.edu 'pwd': Name or service not known 
send: spawn id exp6 not open 
    while executing 
"send "$password\r"" 
    invoked from within <...> 

但是,当我直接运行生成的命令,它的工作原理(忽略gdircolors警告):

~/foo> ssh ***@hive28.cs.berkeley.edu 'pwd' 
***@hive28.cs.berkeley.edu's password: 
/home/ff/cs162/adm/bashrc.d/70-gnu.sh: line 36: gdircolors: command not found 
/home/cc/cs162/sp16/class/*** 
+0

如果您首先使用'ssh-keygen'和'ssh-copy-id',则根本不需要期望。 –

回答

1

试试这个:

set ip "hive28.cs.berkeley.edu" 
set class [lindex $argv 0] 

set cmd [lindex $argv 1] 
spawn ssh "[email protected]$ip" "$cmd" 
expect "assword" 
send "$password\r"; 
interact 

的问题似乎是与你的报价。 "$user\@$ip""$cmd"是两个独立的论点。

+1

关于Tcl的2个小点(期望):1.“@”不是特殊字符,不需要转义; 2. Tcl不需要引用变量,即使变量值包含空格。 –

+0

我完全知道;我正在尝试对OP的脚本进行微小的更改。行情是为了清晰;他们不会造成伤害。但是,在评论中很好地指出!即使它在原始代码中,我也会删除'@'转义符。谢谢! – Will

+1

它工作 - 谢谢! – user1299784

相关问题