免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4338 | 回复: 5

[系统管理] expect自动登陆时的多重判断(超过二个判断) [复制链接]

论坛徽章:
0
发表于 2022-01-17 12:14 |显示全部楼层

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

我当前在用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的内容就会引发系统登陆上去了但是卡住不动了。
请问一下这个问题有解决办法么? 谢谢!!!

论坛徽章:
6
15-16赛季CBA联赛之浙江
日期:2021-07-14 11:18:4315-16赛季CBA联赛之浙江
日期:2021-08-20 17:26:1015-16赛季CBA联赛之天津
日期:2021-09-01 10:56:4619周年集字徽章-19
日期:2021-10-12 11:08:032016科比退役纪念章
日期:2021-10-12 11:33:4515-16赛季CBA联赛之深圳
日期:2021-11-11 14:25:38
发表于 2022-01-17 14:37 |显示全部楼层
#!/usr/bin/expect
set timeout 10

脚本开始加一句超时等待,可以参考一下

论坛徽章:
0
发表于 2022-01-17 15:35 |显示全部楼层
这样有个不好的地方,等于它把我某些命令的时间给限制死了。 有时候我运行某些命令,在不同的机器上运行时间有些长有些短。  嗯嗯。不知道有没有更好的方法呢。
您说的做timeout似乎也是一个方法。谢谢您!

论坛徽章:
0
发表于 2022-01-17 16:02 |显示全部楼层
本帖最后由 本友会机友会摄友会 于 2022-01-17 16:06 编辑

我开发的脚本批量运维工具《kasini3000》了解一下。 开源+免费+跨平台
搜 gitee kasini3000
脚本大致有3类:
1 依赖nodelist.csv和被控机powershell。特色是csv中有ip,端口。
2 不依赖csv,依赖被控机powershell。特色是独立。
3 不依赖被控机powershell。需要在调用脚本中用xxx.ps1  -账户 xxx。特色是只支持单行脚本。一行流。


独立命令-winscpbash.jpg



独立命令-powershell.jpg


1批量运维工具对比图.png

论坛徽章:
0
发表于 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  }
          }

论坛徽章:
0
发表于 2022-01-18 18:46 |显示全部楼层
场景:主控机=win,或主控机=linux。被控机=linux
我来谈谈这个问题:
1首先除掉无主机公钥,knowhost的问题。
2win主控机上没有expect。就算是有,也不建议用,不方便批量。
3linux被控机上有,通过ssh【只能执行单行命令,脚本问题】。这个问题源于bash。
用【在被控机安装powershell】的路子,即可解决ssh-bash,只能远程发送单行代码问题。
4批量运维一般用root账户,无疑ssh-key-file是更安全的。甚至要把root+密码禁止掉。
密码可以改,ssh-key-file不能改。ssh-copy-id有只向被控机添加多个公钥key问题。黑客也可以添加key。这造成了不安全。
kasini3000独创了【双ssh-key-file】交替使用,交替更换的路子。
kasini3000独创了【校验双ssh-key-公钥】的路子。校验公钥文件,让公钥文件内,只有2个公钥。

用法:
1 Remote command line:(from win,linux master,to win,linux node)
$object_return_from_node_to_master = ./k_run_ip -ip 1.1.1.1 -scriptblock {command_on_node} -allparameter $a,$b
$object_return_from_node_to_master = ./k_run_ip -ip 1.1.1.1 -file 'd:\script_file_on_master.ps1' -allparameter $a,$b
$string_return_from_node_to_master = ./k_run_ip -ip 1.1.1.1 -scriptblock { bash /tmp/xxx.sh} -allparameter $a,$b

例子:
主控机写一个脚本【a.ps1】
======================
./k_run_ip -ip 1.1.1.1 -scriptblock {
#command_on_node
#这里可以有很多行
#if,for,调用被控机其他脚本。
#还有比这更简单的吗?
} -allparameter $主控机对象1,$主控机对象2
======================
需要先编写nodelist.csv,内填入ip,22,root,pwd,首次运行,会自动用root账户,密码,推送公钥。


结论:
1脚本传参时,远程传递对象,是脚本批量运维的未来。
2批量运维软件可以安装在win,linux主控机。在一套软件内,能控制win,linux被控机,是脚本批量运维的未来。
3远程传递代码块,而不是【一行流】,是脚本批量运维的未来。
4穿透堡垒机,是需要的功能。
5多进程,多线程批量,结果入库,可以根据ip,时间查询结果。
linux上一键安装powershell,
使用win,linux通用的,几十mb的kasini3000,你就掌握了未来。

卡死你3000,开源,免费,跨平台!脚本批量运维框架,而不是yaml框架。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP