expect检查ssh登陆对端是否免密

由于公司项目,升级需要涉及到对端ssh过去取数据,但是如果碰到非免密登陆的,则会一直提示输入密码,卡死在进程里面;

网上查找思路,只有找到expect自动登陆;之前想过写自动登陆脚本,由于密码不太确定,且防止泄密风险;没有做

expect脚本如下,使用方法:/usr/bin/expect expect.sh  $dstIp

 1 #/usr/bin/expect
 2 set dstIp [lindex $argv 0]
 3 set timeout 15
 4 spawn /usr/bin/ssh $dstIp
 5 expect {
 6     "*yes/no*" { send "yes\r";exp_continue }
 7     "*password*" { exit 126 }
 8     "*Last login:*" { exit 0 }
 9     timeout { exit 127 }
10 }

 lindex参数,argv从0开始,代表第一个参数

set参数,赋值

spawn参数,启动后期参数,如果执行完需要直接交互,最后加上interact

expect捕获结果,send参数,发送指令

timeout设置超时时间,以秒为单位;如果不满足其他条件,超过timeout就拖出

找了台没有设置免密登陆的机器,执行/usr/bin/expect expect.sh $dstIp

echo $?结果返回126;随便发了个ip测试超时,返回127

皆大欢喜啊;以为就这么完了;

然后再代码中执行,调用/usr/bin/expect expect.sh  $dstIp;悲催,一直都是返回0;

使用-x执行,查看细节,发现执行进去了,然后就出来了,exit值收不到啊;

此刻开始怀疑人生,查找expect的细节,-d可以查看expect的细节;

调用/usr/bin/expect -d expect.sh  $dstIp,一阵莫名激动

发现所有的expect都执行了,就是走到  "*password*" { exit 126 }  然后退出了;

感觉exit 错误,应该没有地方接收;怎么办,很绝望;

继续学习expect,spawn类似起一个子进程,可能子进程还没有结束,拿不到结果。

想到EOF,这个无底洞,肯定能够塞进去一万个结果了;

修改代码:

 1 #/usr/bin/bash
 2 desIp=$1
 3 /usr/bin/expect<<EOF
 4 set timeout 15
 5 spawn /usr/bin/ssh $dstIp
 6 expect {
 7       "*yes/no*" { send "yes\r";exp_continue }
 8       "*password*" { exit 126 }
 9       "*Last login:*" { exit 0 }
10       timeout { exit 127 }
11 }
12 expect eof
13 exit 0
14 EOF

调用脚本,echo $?能够拿到了,都正确;

激动激动,想到马上嵌入到使用脚本中

还是不行;绝望了;

最后没办法,只能不封装接口了,把这段代码直接加入到脚本之中,就ok了;

至此:还不明白为啥封成接口就不支持了??

 

转载于:https://www.cnblogs.com/Shoudler/p/9953778.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值