使用expect在需要的时候自动输入密码登录。由于公司的堡垒机必须使用域账号登录,然后转发密钥,所以每次登录堡垒机都需要手动输入域账号密码。密码太长太复杂,手动输入容易出错,所以我用expect写了个脚本来做,这样不用输入密码就可以登录,大大提高了工作效率!首先我们创建一个文本文件,我们命名为proxy.expect,内容如下:#!/usr/bin/expect#设置超时时间,以秒为单位settimeout10#主要作用是给ssh运行过程,使用来传递交互命令#ssh-A是转发键设置,用于有堡垒机的场景。一般用spawnssh-Ayourname@yourdomain.com#判断最后一次输出结果中是否包含Password:字符串,如果有则立即返回,否则等待一段时间再返回,等待时间这里是之前设置的10秒expect"Password:"#sendpassword\r表示字符串结尾send"yourpassword\r"#执行后保持交互状态,把控制权交给控制台,可以手动操作此时。#如果没有这句话,登录后会退出,不会停留在远程终端。interact注意这个proxy.expect文件里面的内容是交给expect来执行的,不是bash,所以第一行的内容是#!/usr/bin/expect,里面的命令有spawn,expect,send和interact是expect命令而不是bash命令。执行命令如下:expectproxy.expect会自动登录。当然,你也可以自定义命令别名,在.bash_profile文件中加入一行:aliasbb='expect/path/to/proxy.expect'然后source~/.bash_profile使其生效。以后只要输入bb就可以自动登录堡垒机了,完美~注意事项不管用macOS自带的Terminal还是第三方iTerm,我发现用expect自动输入密码会带来一些副作用,比如top命令显示结果会有多余的空行,编辑vim时内容不能全屏,rz/sz上传下载文件会失败等。在做一些复杂的工作时,最好不要用expect登录,不然会出现很多意想不到的情况。当然这些可能和公司的堡垒机有关,我自己的服务器不会用到。原文地址:CroWallNotes2019-06-19补充网友Honoka建议,使用sshpass可以更完美的解决这个问题。试过了,因为安全原因,brew默认不支持安装:TMBP:~tony$brewinstallsshpassError:Noavailableformulawiththename"sshpass"我们不会添加sshpass,因为它对新手SSH用户来说太容易了破坏SSH的安全性。可以使用如下命令安装:brewinstallhttp://git.io/sshpass.rb使用方法:sshpass-p你的密码ssh-A-g你的名字@ip添加命令别名:#添加在~/.bash_profile一行aliasbb='sshpass-pyourpasswordssh-A-gyourname@ip#使其有效source~/.bash_profile完美!解决了使用expect带来的副作用,感谢Honoko~
