**Linux操作系统expect命令远程获取执行后的返回值**

人生第一次写博客,写的原因是想把自己对expect的一点小心得分享给大家,避免小白跟我一样入坑,大佬请忽略.(远程获取目标服务器返回值)

expect参数
启用选项*

  • -c:执行脚本前先执行的命令,可多次使用。
  • -d:debug模式,可以在运行时输出一些诊断信息,与在脚本开始处使用exp_internal 1相似。
  • -D:启用交换调式器,可设一整数参数。
  • -f:从文件读取命令,仅用于使用#!时。如果文件名为"-",则从stdin读取(使用"./-"从文件名为-的文件读取)。
  • -i:交互式输入命令,使用"exit"或"EOF"退出输入状态。
  • –:标示选项结束(如果你需要传递与expect选项相似的参数给脚本时),可放到#!行:#!/usr/bin/expect --。
  • -v:显示expect版本信息。
命令说明
send用于向进程发送字符串
expect从进程接收字符串
spawn启动新的进程
interact允许用户交互

远程获取目标服务器执行命令的返回值

#!/bin/bash
password=111111
expect <<EOF >getfile
set timeout 30
spawn ssh root@192.168.37.131
expect {
"*(yes/no)?" { send "yes\r",exp_continue }
"*password"  { send "$password\r" }
}
expect "]#" { send "test -f /root/ok &&echo 0 || echo 1\r" }
expect "]#" { send "exit\r" }
EOF

这里默认已经安装expect命令了,所以可以直接在shell内进行编辑,脚本做的是ssh对方服务器判断ok文件是否存在并将返回值打印到本地服务器getfile中.(没有安装该命令的小伙伴请自行百度进行安装)

  1. passwd:远程服务器密码
  2. expect <getfile :expect输出命令
  3. set timeout 30 :这是设置超时时间的,现在你只要记住他的计时单位是:秒 ,timeout -1 为永不超时。
  4. spawn ssh root@192.168.37.131: 该进程用户连接远程ssh服务器
  5. {
    “*(yes/no)?” { send “yes\r”,exp_continue } :expect {}代表多行期望;当匹配到yes/no时,自动输入yes并执行回车动作;匹配到password时,自动输入密码并回车。
  6. expect “]#” { send “test -f /root/ok &&echo 0 || echo 1\r” } :匹配到]#时,自动输入上述代码(如果是普通用户登陆的话可以用~]$)
  7. expect “]#” { send “exit\r” }:表示退出expect,捕获终端输出信息的终止。
    执行结果如下
    在这里插入图片描述
    查看远程服务器不存在该文件
    在这里插入图片描述
    脚本执行完成后成功获取到目标结果的返回值.
    有小伙伴不满足于判断文件的返回值,那获取进程或者是linux命令的返回值呢
    本人写了一个例子,下面贴图给大家
#!/bin/bash
password=sunbin
expect <<EOF >getfile
set timeout 30
spawn ssh root@192.168.37.131
expect {
"*(yes/no)?" { send "yes\r",exp_continue }
"*password"  { send "$password\r" }
}
expect "]#" { send "test `/sbin/ip addr | grep 192.168.37.200 | wc -l` -eq 1 &&echo 0 || echo 1\r" }
expect "]#" { send "exit\r" }
EOF

这是一个获取远程服务器是否添加虚拟IP的脚本,起初的时候我就发现一个问题,test /sbin/ip addr | grep 192.168.37.200 | wc -l -eq 1 &&echo 0 || echo 1在执行后的结果获取到的返回值存在异常,在这里插入图片描述
***从上面看到192.168.37.131是没有添加这个192.168.37.200虚拟IP的,而我们执行脚本的结果如下 ***
在这里插入图片描述
***好奇的小伙伴有没有发现问题,send发送的命令返回的值是0,可是正常返回的结果应该是1才对啊,研究了一个expect的用法,通过expect -d发现了问题的所在 ***
在这里插入图片描述原来是在发送send执行的代码前已经执行完/sbin/ip addr | grep 192.168.37.200 | wc -l这段代码了,导致我获取的返回值之前已经将/sbin/ip addr | grep 192.168.37.200 | wc -l这段命令执行完毕了导致后面进行了错误的对比,进而把错误的返回值打印到getfile中了,后将代码更改如下:

#!/bin/bash
password=sunbin
expect <<EOF >getfile
set timeout 30
spawn ssh root@192.168.37.131
expect {
"*(yes/no)?" { send "yes\r",exp_continue }
"*password"  { send "$password\r" }
}
expect "]#" { send "test \`/sbin/ip addr | grep 192.168.37.200 | wc -l\` -eq 1 &&echo 0 || echo 1\r" }
expect "]#" { send "exit\r" }
EOF

执行结果:
在这里插入图片描述
获取返回值就介绍到这里了,需要做本地判断的话,参照下面的代码

value=`sed -n "5,1p" getfile | awk '{print $1}'`
echo $value
if [ `echo $value | awk -v tem="0" '{print($1>tem)? "1":"0"}'` -eq "0" ]; then
        echo "获取的返回值为0" 
else
        echo "获取的返回值为1" 
fi

参考

[1] Shell脚本学习之expect命令,http://www.cnblogs.com/lixigang/articles/4849527.html

[2] expect的安装与使用,http://www.cnblogs.com/jiqing9006/p/9209178.html

[3] Shell脚本交互之:自动输入密码 https://blog.csdn.net/zhangjikuan/article/details/51105166

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值