Chinaunix

标题: expect自动登陆时的多重判断(超过二个判断) [打印本页]

作者: yexingqi    时间: 2022-01-17 12:14
标题: expect自动登陆时的多重判断(超过二个判断)

请教各位大侠一个问题,任何建议都感激不尽哈!

我当前在用expect写一个自动ssh登陆的脚本用来执行某些shell命令。
正常情况下,ssh到远端机器就是以下二个判断:
1. 首次登陆则输入yes.
2. 直接问密码的则输入密码,如下:
spawn ssh $sshhost -l $USER
expect {
"yes/no" {send "yes\n"; exp_continue;}
"*password:" {send "$password\n"}
}


但在我这个场景中,有多一个情况。 就是某一些机器在ssh的时候它能用我的ssh key文件实现全自动登陆,不需要询问密码。 直接spawn ssh $sshhost -l $USER就登陆了。
所以就等于在上面的判断中,还要额外加一个判断,如果不询问密码,不询问yes/no,如果碰到能用ssh key自动登陆的主机, 那上面的这个expect的内容就会引发系统登陆上去了但是卡住不动了。
请问一下这个问题有解决办法么? 谢谢!!!

作者: a5love3n    时间: 2022-01-17 14:37
#!/usr/bin/expect
set timeout 10

脚本开始加一句超时等待,可以参考一下
作者: yexingqi    时间: 2022-01-17 15:35
这样有个不好的地方,等于它把我某些命令的时间给限制死了。 有时候我运行某些命令,在不同的机器上运行时间有些长有些短。  嗯嗯。不知道有没有更好的方法呢。
您说的做timeout似乎也是一个方法。谢谢您!


作者: 本友会机友会摄友会    时间: 2022-01-17 16:02
提示: 作者被禁止或删除 内容自动屏蔽
作者: yexingqi    时间: 2022-01-17 17:16

我好像找到解决方法了。虽然原理还有些不懂。。。

参考以下网上找到的数据就可以了。
expect {
          "\[#$\]"     {send "\r" }   ### 假如有了ssh 公钥之类的,直接回车。当然普通用户下边还可能需要sudo,自己处理一下吧。
          "not know" {send_user "[exec echo \"not know\"]";exit}
          "(yes/no)?" {send "yes\r";exp_continue} #continue的意义,靠猜测也能差不多知道了吧?可以Man expect
          "password:" {send  "$pwd\r"}
          "permission denied, please try again." {
    send_user "[exec echo \"Errorassword is wrong\"]"
    exit  }
          }
作者: 本友会机友会摄友会    时间: 2022-01-18 18:46
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2