3

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

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

我知道invidiual命令,这将是:1)检查ssh连接:

ssh -q user@ip exit

echo $?

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

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

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

3) 来自远程主机的 scp back 文件

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 生成 ssh 用户@主机顶部 -n 3 -b > /tmp/top.out 期望密码:{ 发送密码\r } 睡眠 1 退出 "

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

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

4

2 回答 2

4

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

(AFAIK,expect主要用于与调制解调器(AT 命令集)等进行通信)。

对自动 ssh 和 scp 使用 SSH 密钥而不是密码。一旦你完成了(甚至之前,但你必须手动输入密码),在你的 shell 中启动它:

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

并且该文件将在您的本地计算机上。(因为重定向是在本地完成的,而不是远程完成的)。无需 scp。

这里的所有都是它的。

于 2012-06-29T14:45:16.797 回答
0

检查这个: https ://stackoverflow.com/a/23632210/524743

expect <<'END'
log_user 0
spawn sh -c {echo hello; exit 42}
expect eof
puts $expect_out(buffer)

lassign [wait] pid spawnid os_error_flag value

if {$os_error_flag == 0} {
    puts "exit status: $value"
} else {
    puts "errno: $value"
}
END

hello

exit status: 42

从期望手册页

等待[参数]

延迟直到衍生的进程(或当前进程,如果没有被命名)终止。

wait 通常返回四个整数的列表。第一个整数是等待的进程的 pid。第二个整数是对应的 spawn id。如果发生操作系统错误,则第三个整数为 -1,否则为 0。如果第三个整数为 0,则第四个整数是衍生进程返回的状态。如果第三个整数是-1,第四个整数就是操作系统设置的errno值。还设置了全局变量 errorCode。

于 2015-05-07T15:30:41.597 回答