我需要传递两个参数来预期,第一个是执行命令,第二个是密码。
这是我的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)
为什么?
答案 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
但是其他人已经这样做了。我们不需要重新发明轮子。
答案 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