痛點
一般情況下,公司所有的服務器都在內網,公網訪問、管理服務器都要先通過登錄一臺跳板機,然后再由跳板機登錄到相應的服務器進行操作,跳板機與服務器的連接都是內網地址。我們經常看到的現象就是下圖這樣(博主 Mac 自帶的終端做的演示),每次都要通過 ssh 登錄兩次,輸入兩次密碼,密碼也經常輸錯,不勝其煩。
這時候我們就需要用比較好的工具來解決這個問題,能夠實現自動登錄,避免時間耗到這種無意義的事情上。我所用到的工具是 iTerm2,iTerm2 是一款非常好用的 Mac 終端工具,具體介紹及基本用法可自行搜索。當然只有iTerm2 還不夠,還要配合 Linux expect 的腳本才能實現自動登錄。
解決方法
expext 腳本
通過跳板機登錄內網服務器,如果只登陸有外網的服務器,把有關內網的部分刪掉就可以啦,例如跳板機就是有外網的服務器。
#!/usr/bin/expect
set host [lindex $argv 0]
set TERMSERV 跳板機IP
set USER 跳板機用戶名
set PASSWORD 跳板機密碼
set UATUN 內網服務器用戶名
set UATPWD 內網服務器密碼
# 登錄跳板機
spawn ssh -l $USER $TERMSERV
expect {
"yes/no" {send "yes\r";exp_continue;}
"*password:*" { send "$PASSWORD\r" }
}
# 登錄內網
expect "*跳板機用戶名@*" {send "ssh -l $UATUN $host\r"}
expect {
"yes/no" {send "yes\r";exp_continue;}
"*password:*" { send "$UATPWD\r" }
}
interact
把上面的腳本保存成一個文件,比如 login_inner ,保存在你指定一個文件夾下,我文件的路徑是 /Users/wangyongzhi/.ssh/login_inner
,wangyongzhi
是我本機用戶名。
別忘了加上可執行權限,方式是 chmod -R a+x /Users/wangyongzhi/.ssh/login_inner
,
不然等下執行的時候會報
permission denied: /Users/wangyongzhi/.ssh/login_inner
解釋以上 shell 腳本都是什么意思
#!/usr/bin/expect
注意:這一行必須在腳本的第一行,告訴操作系統腳本里的代碼使用哪一個 shell 來執行
set host [lindex $argv 0]
這一行是設置一個變量的意思,變量名隨便起,盡量有意義,后面表示的是傳入的參數,0 表示第一個參數,后面會用到。
下面幾個 set 類似,跳板機用戶名密碼一般都一樣,可以放到這個腳本里面,內網服務器的可以選擇性的放,也可以把他們放到參數里面依次傳進來,本文只拿一個做例子。
spawn ssh -l $USER $TERMSERV
spawn 是 expect 環境的內部命令,它主要的功能是給 ssh 運行進程加個殼,用來傳遞交互指令。
expect {
"yes/no" {send "yes\r";exp_continue;}
"*password:*" { send "$PASSWORD\r" }
}
expect 也是 expect 環境的一個內部命令。判斷上一個指令輸入之后的得到輸出結果是否包含""雙引號里的字符串,比如后面的"*password:*",表示上一個輸出結果包含password:
*通配符表示前后可以是任意字符。
如果是第一次登錄,會出現"yes/no"的字符串,就發送(send)指令"yes\r",然后繼續(exp_continue)。
下面的類似。
interact:執行完成后保持交互狀態,把控制權交給控制臺。
iTerm2 配置
解釋完上面的腳本,下面就要配置 iTerm2 了。
在 preferences->profiles 里面選左下角的 + 號增加一條,配置如下圖所示,
Name: 隨便起,盡量有意義,你自己知道是哪臺服務器
Tags: 標簽,可寫可不寫,服務器多的話建議設置一個
send text at start: /Users/wangyongzhi/.ssh/login_inner 內網服務器IP
也可以寫成 ~/.ssh/login_inner 內網服務器IP
內網服務器IP就是上面shell腳本里面的參數,跟前面的文件有空格哈
好了,到此為止,你就完成了所有的準備工作,這時候再登錄服務器,只需要三步就可以了
1、打開 iTerm2
2、快捷鍵 Command + o 打開如下圖所示的Profiles
3、選中你要進入的服務器名字,就可以進入啦
如果覺得內容還不錯,可以關注一下我哦
微信公眾號:志哥 (ID: zhige-me)
期待與你相遇,一同成長前行!