在shell脚本中使用expect

时间:2011-03-02 23:25:49

标签: linux shell expect

我需要传递两个参数来预期,第一个是执行命令,第二个是密码。

这是我的expect.sh

#!/usr/bin/expect
spawn [lrange $argv 0 0]
expect "password:"
send [lindex $argv 1]
interact

主脚本:

./expect.sh "ssh root@$SERVER1"  $SERVER1_PASS

错误:

couldn't execute "{ssh root@xxx.xxx.xx.xxx}": no such file or directory
    while executing
"spawn [lrange $argv 0 0]"
    (file "./expect.sh" line 2)

为什么?

2 个答案:

答案 0 :(得分:3)

据我所知,spawn的第一个参数需要是一个字符串,而不是一个字符串列表。

尝试将多字命令行作为单个字符串传递将导致问题。我认为你必须在调用spawn之前拆分空格,如果一个参数包含一个空格,那就会破坏。也许最好将密码指定为第一个参数,将命令指定为其余参数。

所以尝试类似:

#!/usr/bin/expect
spawn [lindex $argv 1] [lrange $argv 2 end]
expect "password:"
send [lindex $argv 0]
interact

但即使这样也行不通。

根据comp.lang.tcl(Re: expect - spawn fails with argument list)上的Google Groups version,我们必须调用eval来拆分列表。

所以答案应该是:

#!/usr/bin/expect
eval spawn [lrange $argv 1 end]
expect "password:"
send [lindex $argv 0]
interact

最后,您需要在密码后发送Enter,因此您需要:

#!/usr/bin/expect
eval spawn [lrange $argv 1 end]
expect "password:"
send [lindex $argv 0]
send '\r'
interact

然后切换顺序,在调用它时不要引用命令:

./expect.sh "$SERVER1_PASS" ssh root@$SERVER1

但是其他人已经这样做了。我们不需要重新发明轮子。

参见例如expect ssh login script

答案 1 :(得分:0)

就scp而言,我发现shell脚本非常令人不安。我决定在crontab中使用php脚本。

Php有一个功能

$conn = ssh2_connect($scpServer, 22); 

然后致电

ssh2_auth_password($conn, $scpUser, $scpPassword);

ssh2_scp_send($conn, $scpLocalPath, $scpRemotePath);

OR

ssh2_scp_recv($conn, $scpRemotePath, $scpLocalPath);

你完成了。

当然,您需要定义用户,密码和其他

的变量

虽然我建议你为scp的目的创建一个linux用户。

为了安装ssh2,try