如何使用Expect在服务器上执行命令

时间:2017-07-07 07:39:31

标签: bash shell ssh server expect

我想远程删除文件/在我的服务器上执行另一个脚本。手动这可以通过ssh-login - >完成。 cd /path/ - > rm somefiles - > . script.sh

我想自动完成这个过程。因此,当我执行expect expectscript.sh port serverip user userpasswd时,脚本将为我完成整个过程。

所以我写下面的脚本。事情进展顺利,直到ssh-login过程结束。我不知道代码的最后3行有什么问题。有人可以帮忙吗?

#!/usr/bin/expect
set timeout 20
set port [lindex $argv 0]
set ip [lindex $argv 1]
set user [lindex $argv 2]
set password [lindex $argv 3]
spawn ssh "$user\@$ip" "-p" "$port"
expect "password:"
send "$password\r"
spawn "cd /etc/abcd/"
spawn "rm -f efg/*"
spawn ". somescriptinefg.sh"

2 个答案:

答案 0 :(得分:2)

spawn更改为send解决问题〜

字面意思,

spawn“通过运行给定程序创建新进程。”

send“将字符串发送到当前进程。”

答案 1 :(得分:0)

问题似乎是密码是使用spawn命令而不是send命令发送的。此外,可以使用特定命令调用ssh以在会话期间运行,例如:

#!/usr/bin/expect
set timeout 20
set port [lindex $argv 0]
set ip [lindex $argv 1]
set user [lindex $argv 2]
set password [lindex $argv 3]
spawn ssh $user@$ip -p $port "cd /etc/abcd/; rm -f efg/*; . somescriptinefg.sh"
expect "password:*"
send "$password\r"
expect eof

可能值得为passwordless access配置ssh密钥。这将消除对期望脚本的需要并将整个事物减少到一行。如果你真的需要一个交互式的ssh会话,那么诸如sshpass之类的工具可能不那么实用。