使用 expect 在必要状况下实现自动输入密码登录

因为公司的堡垒机必需要用域帐号登录,而后转发密钥,因此每次登录堡垒机的时候都须要手动输入域帐号密码。密码太长且复杂,手动输入容易输错,故使用 expect 写了个脚原本作这个事情,实现免输入密码登录,工做效率大大提高!html

首先咱们建立以一个文本文件,咱们就命名为 proxy.expect,内容以下:git

#!/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,而且里面的命令如 spawnexpectsendinteract 都是 expect 的命令而不是 bash 命令。vim

执行命令以下:segmentfault

expect proxy.expect

这样就自动登录了。安全

固然,也能够自定义一个命令别名,在 .bash_profile 文件里增长一行:bash

alias bb='expect /path/to/proxy.expect'

而后 source ~/.bash_profile 使之生效。服务器

之后只须要输入 bb 就能够了自动登录堡垒机了,完美~dom

注意事项

不管使用 macOS 自带的 Terminal 仍是第三方的 iTerm,我发现使用 expect 自动输入密码会带来一些反作用,好比 top 命令显示出来的效果会出现多余空行、vim 编辑时内容不能全屏、rz/sz 上传下载文件失效等等,作一些复杂的工做的时候,仍是不要使用 expect 登陆,否则会出现不少意想不到的状况。固然,这些多是公司堡垒机有关,我本身服务器不会用获得的。ssh


原文地址:CroWall Notesui


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 带来的反作用,感谢 穗乃果

相关文章
相关标签/搜索