【问题标题】:How to execute a command on server using Expect如何使用 Expect 在服务器上执行命令
【发布时间】: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


【解决方案1】:

问题似乎是使用 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 这样的工具可能是一个不太实用的替代方案。

【讨论】:

  • hmm,我用send命令发送了密码,登录过程似乎没问题。我通过将最后3行中的spawn命令修改为send解决了这个问题。不过还是谢谢你。
【解决方案2】:

spawn改成send解决问题~

从字面上看,

spawn "通过运行给定程序创建一个新进程。"

send "向当前进程发送字符串。"

【讨论】:

    猜你喜欢
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    • 2012-05-24
    • 1970-01-01
    相关资源
    最近更新 更多