因爲公司的堡壘機必需要用域帳號登錄,而後轉發密鑰,因此每次登錄堡壘機的時候都須要手動輸入域帳號密碼。密碼太長且複雜,手動輸入容易輸錯,故使用 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
,而且裏面的命令如 spawn
、expect
、send
、interact
都是 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
網友穗乃果提示,用 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
帶來的反作用,感謝 穗乃果~