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

Bash 如何使用Expect在服务器上执行命令,bash,shell,ssh,server,expect,Bash,Shell,Ssh,Server,Expect,我想在我的服务器上远程删除一个文件/执行另一个脚本。这可以通过ssh登录->cd/path/->rmsomefiles->手动完成。script.sh 我想自动完成这个过程。因此,当我执行expect expectscript.sh port serverip user userpasswd时,脚本将为我完成整个过程 所以我写了下面的脚本。在ssh登录过程完成之前,一切都很顺利。我不知道最后3行代码有什么问题。有人能帮忙吗 #!/usr/bin/expect set timeout 20 set

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

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

所以我写了下面的脚本。在
ssh登录过程完成之前,一切都很顺利。我不知道最后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"

spawn
更改为
send
解决问题~

从字面上说

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


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

问题似乎是密码是通过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

可能值得为其配置ssh密钥。这将消除对expect脚本的需要,并将整个过程简化为一行。如果您真的需要一个交互式ssh会话,那么像这样的工具可能是一个不那么不切实际的选择。

我认为可能是
send
而不是
spawn
。如果解决了,将回复。既然您已经有了ssh设置,为什么不直接运行
ssh呢user@ip“cd/path&&rm有时&&./script.sh”
。为什么除了生意之外,其他的都是生意?如果没有为无密码登录设置ssh,则可以使用
sshpass
。比预期的更强大,这是最后的手段。在我的情况下,主要是因为有1台以上的服务器,我想在它们上运行相同的过程(有多个步骤),通过简单地使用ssh命令,密码将被多次询问。您可以使用密钥对阻止密码查询,或者如果您不能这样做,您可以,如上所述,使用sshpass。这可以使用一个简单的shell脚本进行循环。它将比基于expect的解决方案更快、更健壮。
sshpass
需要运行一个命令。通常在那里提供一个ssh管道,它可以更改端口。所以类似于sshpass-ps33kr3tsh-p5678的东西noufal@server
.hmm,我用
send
命令发送了密码,登录过程似乎正常。我通过将最后3行中的
spawn
命令修改为
send
解决了这个问题。不过还是谢谢你。