使用-expect-在必要情况下实现自动输入密码登陆

由于公司的堡垒机必须要用域账号登陆,然后转发密钥,所以每次登陆堡垒机的时候都需要手动输入域账号密码。密码太长且复杂,手动输入容易输错,故使用 expect 写了个脚本来做这个事情,实现免输入密码登陆,工作效率大大提升! 首先我们创建以一个文本文件,我们就命名为 proxy.expect,内容如下: #!/usr/bin/expect# 设置超时时间,单位秒set timeout 10# 主要功能是给ssh运行进程加个壳,用来传递交互指令# ssh -A 是转发密钥设置,用于有堡垒机的场景,一般情况下不需要spawn ssh -A yourname@yourdomain.com# 判断上次输出结果里是否包含 Password: 的字符串,如果有则立即返回,否则就等待一段时间后返回,这里等待时长就是前面设置的 10秒expect "Password:"# 发送密码 \r 表示字符串结束send "yourpassword\r"# 执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。# 如果没有这一句登录完成后会退出,而不是留在远程终端上。interact注意一下,这个 proxy.expect 文件里的内容,都是交给 expect 去执行的,而不是 bash,所以第一行的内容是 #!/usr/bin/expect,并且里面的命令如 spawn、expect、send、interact 都是 expect 的命令而不是 bash 命令。 执行命令如下: expect proxy.expect这样就自动登陆了。 当然,也可以自定义一个命令别名,在 .bash_profile 文件里增加一行: alias bb='expect /path/to/proxy.expect'然后 source ~/.bash_profile 使之生效。 以后只需要输入 bb 就可以了自动登陆堡垒机了,完美~ 注意事项无论使用 macOS 自带的 Terminal 还是第三方的 iTerm,我发现使用 expect 自动输入密码会带来一些副作用,比如 top 命令显示出来的效果会出现多余空行、vim 编辑时内容不能全屏、rz/sz 上传下载文件失效等等,做一些复杂的工作的时候,还是不要使用 expect 登录,不然会出现很多意想不到的情况。当然,这些可能是公司堡垒机有关,我自己服务器不会用得到的。 ...

June 13, 2019 · 1 min · jiezi

使用Expect实现自动化交互

*写在前面最近开发的一个项目希望实现这样一个功能。将本地项目创建脚手架置于远程服务器,而用户需要创建项目时,仅需要在提供的页面上填入一些项目基础配置并提交,后台便会根据选择自动化创建项目并push上仓库。咋看是个非常简单的需求,我们仅需要在用户发起创建请求时在后端调取shell脚本并可以实现这一系列的操作。然而目前项目创建脚手架不支持多参数传递,只能通过用户输入完成各参数传递的操作。于是抛出本文的主角:Expect,以实现一系列的自动化交互动作。Expect简介expect是一个免费的编程工具,用来实现自动的交互式任务,而无需人为干预。说白了,expect就是一套用来实现自动交互功能的软件。在实际工作中,我们运行命令、脚本或程序时,这些命令、脚本或程序都需要从终端输入某些继续运行的指令,而这些输入都需要人为的手工进行。而利用expect,则可以根据程序的提示,模拟标准输入提供给程序,从而实现自动化交互执行。这就是expect!!!Expect命令使用expect时,首先需要在文件顶部写入#!/usr/bin/expect,已告知进程这是一个expect文件。而在脚本书写中基本离不开以下这「六」个命令。spawn 启动新的进程expect 用来等待一个进程的反馈,我们根据进程的反馈,再发送对应的交互命send 发送需要交互的值,替代了用户手动输入内容set 设置变量值expect eof 自动化结束interact 退出自动化,进入人工交互Expect语法expect使用的是tcl语法,详细教程可查阅TCL基本语法 - Tcl教程这里提供几个简单的流程控制,一般来说已经够用了。传参expect参数值存放在$argv中,比如取第一个参数就是[lindex $argv 0],以此类推。// 执行命令 xxx.sh mike 22 engineer#!/usr/bin/expectset name = [lindex $argv 0]set age = [lindex $argv 1]set job = [lindex $argv 2]if/elseif {$a == ‘a’} { set flag = 0} else { set flag = 1}expect ‘请输入xxx的值‘send $flag循环匹配一般来说expect匹配成功会会退出语句,而exp_continue表示循环匹配。匹配到改关键字后继续从头开始匹配。例如安装软件时需要输入多个 yes。expect { “yes/no” { send “yes” exp_continue } eof { send “eof” }}栗子 未完待续

March 31, 2019 · 1 min · jiezi

iTerm2结合 expect 脚本实现 ssh 登录跳板机后登录指定服务器

痛点一般情况下,公司所有的服务器都在内网,公网访问、管理服务器都要先通过登录一台跳板机,然后再由跳板机登录到相应的服务器进行操作,跳板机与服务器的连接都是内网地址通常情况下,我们都是通过两次ssh,第一次本地机器登录跳板机,第二次在跳板机登录指定机器,需要输入两次密码,容易输错后端码农每天要无数次登录各种机器,如果能通过工具自动化,每次能省半分钟,并且心情会愉悦很多,下面来进行实战expect 脚本#!/usr/bin/expectset host [lindex $argv 0]# 设置一个变量,传入的参数,0 表示第一个参数,同时也为了复用,毕竟不只是管理一台服务器set TERMSERV 跳板机IPset USER 跳板机用户名set PASSWORD 跳板机密码set UATUN 内网服务器用户名set UATPWD 内网服务器密码# 登录跳板机spawn ssh -l $USER $TERMSERV# expect是expect环境的一个内部命令,判断上一个指令输入之后的得到输出结果是否包含"“双引号里的字符串,比如后面的”password:",表示上一个输出结果包含password:通配符表示前后可以是任意字符#类似于编程中的 switch语句,exp_continue相当于 continueexpect { “yes/no” {send “yes\r”;exp_continue;} “password:” { send “$PASSWORD\r” } }# 登录内网expect “$USER@*” {send “ssh -l $UATUN $host\r”}expect { “yes/no” {send “yes\r”;exp_continue;} “password:” { send “$UATPWD\r” } }interact# 执行完成后保持交互状态,把控制权交给控制台将脚本保存成一个文件,例如 server.exp可执行权限,chmod +x server.exp配置 iTerm2进入配置页面, Profiles -> Open Profiles -> Edit Profiles配置如图所示send text at start: [expect脚本路径] [参数0] [参数1] … 以空格分割大功告成到此为止,已完成所有准备工作,此时再进入指定机器,只需要三步打开 iTerm2快捷键 Command+o 打开 Profiles 面板选中某个 profile 单击,就直接进入目标机器了,开始挥洒方遒吧!温馨提示之所以在expect 脚本中设置了一个参数,是为了复用,要进入别的机器,复用同一个 .exp脚本,添加一个新的 profile 即可exp 脚本可以多个参数,达到更多场景下复用,具体又童鞋自己考量也可以把exp脚本当做sh脚本一样执行,比如 ./test-server.exp in-test-server-goapi-1,这样可以不必要配置 profileGitHub源码传送门各种数据结构及算法实现, LeetCode解题思路及答案大厂面试题汇总及答案解析本文为原创文章,转载注明出处,欢迎扫码关注公众号 楼兰 或者网站https://lovecoding.club,第一时间看后续精彩文章,觉得好的话,顺手分享到朋友圈吧,感谢支持。 ...

January 15, 2019 · 1 min · jiezi

expect+shell实现自动ssh的证书密码自动登录

场景说明client发起ssh携带私钥证书登录server服务器,一般私钥都是设置密码的,所以产生了交互,正常情况下,我们必须手动操作输入密码,登录到服务器,非常的繁琐,所以我们来尝试自动登录尝试方式使用sshpass使用expect+shell组合sshpass尝试[失败]# 尝试直接安装,发现找不到brew install sshpass# 安装sshpassbrew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb# 尝试sshpass自动输入密码,发现携带了证书的一直卡着不动,失败sshpass -p 密码 ssh -i my_pri.pem myaccount@ip -p22expect+shell尝试[成功]安装expectbrew install expectjp.sh 脚本#!/bin/bashssh -i my_pri.pem myaccount@ip -p22chmod a+x jp.shexpjp.exp 脚本#!/usr/bin/expect -fspawn ./jp.sh# 注意 这里的文字需要根据自己提示自行调整expect “Enter passphrase for key ‘my_pri.pem’:“send “密码\n"interactchmod a+x expjp.exp尝试运行//运行成功./expjp.exp总结expect可以在各种产生交互的地方使用,等待大家慢慢挖掘

December 27, 2018 · 1 min · jiezi