bash - 使用 BASH 和 Expect 进行远程 SSH 和命令执行

标签 bash ssh expect

我正在尝试使用 bash 脚本实现以下目标:

  1. 尝试SSH连接,如果失败,SSH连接成功则报错
  2. 确认后,执行'top'命令并将结果保存到文件
  3. 从远程服务器返回scp文件

我知道个别命令,它们是: 1)检查ssh连接:

ssh -q user@ip exit

echo $?

成功时应返回“0”,错误时应返回“255”。

2) 执行 top 并保存到文件将是:

top -n 1 -b > /tmp/top.out

3) scp 从远程主机返回文件

expect -c "
   set timeout 1
   spawn scp user@host:/tmp/top.out root@anotherhost:/.
   expect yes/no { send yes\r ; exp_continue }
   expect password: { send password\r }
   expect 100%
   sleep 1
   exit
"

现在把这些放在一起是我的问题,更具体地说:

  • 在使用 expect 测试 SCP 连接时,我似乎无法获得返回的“0”和“255”值。

    • 我似乎无法再次使用 expect 执行 top 命令,即这不起作用:

    期待-c“ 设置超时 1 spawn ssh user@host top -n 3 -b >/tmp/top.out 期望密码:{ 发送密码\r } sleep 1 导出 "

    • 因此第三位也不起作用。

感谢任何帮助。请记住,我的脚本是带有 #!/bin/bash 声明的 .sh 脚本——我不能将 #!/usr/bin/expect 用于各种原因。

最佳答案

现在那是丑陋的东西。有很多陷阱,您可能不太确定在什么地方使用 shell 或普通 argv 数组执行。此外,期望的东西不是应该完成的方式,那只是脆弱的。

(AFAIK,expect 主要是用来和调制解调器(AT 命令集)等通信)。

使用 SSH key 代替密码进行自动 ssh 和 scp。一旦你这样做了(或者甚至之前,但你必须手动输入密码),在你的 shell 中启动它:

$ ssh user@server "top -n 1 -b" > /tmp/top.out

文件将在您的本地机器上。 (因为重定向是在本地完成的,而不是远程完成的)。不需要 scp。

仅此而已。

关于bash - 使用 BASH 和 Expect 进行远程 SSH 和命令执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11227648/

相关文章:

ruby-on-rails - ruby on rails ssh连接而不提供密码

ssh - GridGain - 通过 Grid.startNodes API 使用 SSH 以编程方式打开节点

tcl - 如何在 Expect 中保存和解析命令输出?

expect - Expect 的 "-r"命令中的 "expect -r PATTERN"是什么意思?

bash - 从Linux bash调用Matlab时捕获错误消息

linux - 如何根据文件名模式删除文件?

php - ssh 使用rsync 并备份到本地

comparison - Expect 能做什么而 Pexpect 不能做什么?

linux - 如何转义 sed 输入文件

java - Grep 在文件中找到特定文本字符串后的 5 行