【发布时间】:2017-12-11 10:07:21
【问题描述】:
我想在我的服务器上远程删除一个文件/执行另一个脚本。这可以通过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"
【问题讨论】:
-
我想可能是
send而不是spawn。如果解决了会回复的。 -
既然你已经设置好了ssh,为什么不直接运行
ssh user@ip "cd /path && rm sometimes && ./script.sh"。为什么除了生意之外的一切?如果您没有为无密码登录设置 ssh,您可以使用sshpass。比预期的要强大得多,这是最后的手段。 -
在我的情况下,主要是因为有超过 1 台服务器,我想在它们上运行相同的进程(有多个步骤),只需使用 ssh 命令,就会多次询问密码。
-
您可以使用密钥对来阻止密码查询,或者如果您不能这样做,您可以使用 sshpass,如上所述。这可以使用简单的 shell 脚本循环。它将比基于期望的解决方案更快、更健壮。
-
sshpass期望命令运行。您通常会在那里提供一个 ssh 管道,这可以更改端口。所以像sshpass -p s33kr3t ssh -p 5678 noufal@server.
标签: bash shell ssh server expect