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

时间:2012-06-27 13:43:31

标签: bash ssh expect

我正在尝试使用bash脚本实现以下功能:

  1. 尝试SSH连接,如果失败,则在SSH连接
  2. 时出错
  3. 确认后,执行'top'命令并将结果保存到文件
  4. 从远程服务器返回的scp文件
  5. 我知道invidiual命令,它们将是: 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 \ n}     睡觉1     出口   “

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

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

2 个答案:

答案 0 :(得分:4)

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

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

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

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

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

这就是它的全部内容。

答案 1 :(得分: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

来自期待手册页

  

等[args]

     

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

     

等待正常返回四个整数的列表。第一个整数是等待进程的pid。第二   integer是相应的spawn id。如果是,则第三个整数为-1   发生操作系统错误,否则为0。如果是第三个整数   为0,第四个整数是生成的返回状态   处理。如果第三个整数是-1,则第四个整数是该值   由操作系统设置的错误号。全局变量errorCode是   也设定了。