使用 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 帶來的反作用,感謝 穗乃果

相關文章
相關標籤/搜索