通常狀況下,公司全部的服務器都在內網,公網訪問、管理服務器都要先經過登陸一臺跳板機,而後再由跳板機登陸到相應的服務器進行操做,跳板機與服務器的鏈接都是內網地址git
一般狀況下,咱們都是經過兩次ssh,第一次本地機器登陸跳板機,第二次在跳板機登陸指定機器,須要輸入兩次密碼,容易輸錯github
後端碼農天天要無數次登陸各類機器,若是能經過工具自動化,每次能省半分鐘,而且心情會愉悅不少,下面來進行實戰golang
#!/usr/bin/expect
set host [lindex $argv 0]
# 設置一個變量,傳入的參數,0 表示第一個參數,同時也爲了複用,畢竟不僅是管理一臺服務器
set TERMSERV 跳板機IP
set USER 跳板機用戶名
set PASSWORD 跳板機密碼
set UATUN 內網服務器用戶名
set UATPWD 內網服務器密碼
# 登陸跳板機
spawn ssh -l $USER $TERMSERV
# expect是expect環境的一個內部命令,判斷上一個指令輸入以後的獲得輸出結果是否包含""雙引號裏的字符串,好比後面的"*password:*",表示上一個輸出結果包含password:*通配符表示先後能夠是任意字符
#相似於編程中的 switch語句,exp_continue至關於 continue
expect {
"yes/no" {send "yes\r";exp_continue;}
"*password:*" { send "$PASSWORD\r" }
}
# 登陸內網
expect "*$USER@*" {send "ssh -l $UATUN $host\r"}
expect {
"yes/no" {send "yes\r";exp_continue;}
"*password:*" { send "$UATPWD\r" }
}
interact
# 執行完成後保持交互狀態,把控制權交給控制檯
複製代碼
Profiles -> Open Profiles -> Edit Profiles
send text at start: [expect腳本路徑] [參數0] [參數1] ...
以空格分割
複製代碼
到此爲止,已完成全部準備工做,此時再進入指定機器,只須要三步面試
exp腳本
當作sh腳本
同樣執行,好比 ./test-server.exp in-test-server-goapi-1
,這樣能夠沒必要要配置 profile本文爲原創文章,轉載註明出處,歡迎掃碼關注公衆號
樓蘭
或者網站lovecoding.club,第一時間看後續精彩文章,以爲好的話,順手分享到朋友圈吧,感謝支持。算法