作者:jac | 来源:互联网 | 2023-10-11 17:43
由于公司的堡垒机必须要用域账号登陆,然后转发密钥,所以每次登陆堡垒机的时候都需要手动输入域账号密码。密码太长且复杂,手动输入容易输错,故使用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 登录,不然会出现很多意想不到的情况。当然,这些可能是公司堡垒机有关,我自己服务器不会用得到的。
2019-06-19 补充
网友穗乃果提示,用 sshpass
可以更完美地解决这个问题。
试了一下,因为安全原因,brew 默认不支持安装:
TMBP:~ tony$ brew install sshpass
Error: No available formula with the name "sshpass"
We won't add sshpass because it makes it too easy for novice SSH users to
ruin SSH's security.
可以用以下命令安装:
brew install http://git.io/sshpass.rb
使用方法:
sshpass -p 你的密码 ssh -A -g yourname@ip
添加命令别名:
# 在 ~/.bash_profile 中添加一行
alias bb='sshpass -p 你的密码 ssh -A -g yourname@ip
# 使之生效
source ~/.bash_profile
完美!解决了使用 expect
带来的副作用,感谢 穗乃果~