我想远程删除文件/在我的服务器上执行另一个脚本。手动这可以通过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"
答案 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之类的工具可能不那么实用。