我正在尝试使用 bash 脚本实现以下目标:
- 尝试SSH连接,如果失败,SSH连接成功则报错
- 确认后,执行'top'命令并将结果保存到文件
- 从远程服务器返回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/