巧用 SecureCRT 實現復雜的 ssh 登錄過程自動化
以前公司的服務器都是在 SecureCRT 里直接 ssh 連接,但是最近公司處于安全審計考慮,在所有服務器前加了一層堡壘機,而且密碼采用 kerberos 集中授權認證。這樣問題就來了,雖然安全審計的目的達到了,但是登錄服務器的效率卻大打折扣,以前點一次鼠標就登錄的過程,現在還要手動輸入3次命令或密碼才能完成。機器少還好,多的話,這個體驗和流程對于追求效率的 RD 來說苦不堪言。記得在《打造 非死book》一書中也曾提到了 非死book 的工具文化,其中一條是說凡是被很多人不斷重復的好的習慣,都要將其自動化。推而廣之,那么這里究竟有沒有辦法自動化這個登錄過程呢?
經過和運維同學溝通得知,SecureCRT 的 Logon Action 可以在登錄過程中發送指令去完成權限校驗實現自動登錄。回想起來這個功能自己也不算陌生,早先在電信行業工作的時候權限認證非常復雜,也是這么干的,只是這么幾年沒有那樣嚴苛的環境,倒是忘了這茬了。
ok,言歸正傳,其實這個過程挺簡單的,你只需要把整個復雜登錄認證流程走一遍,把其中的關鍵提示文本記下來,然后根據流程順序創建相應的 Action 即可。
1、自動登錄單臺服務器
先看圖,后面我會說原理。
2、批量登錄多臺服務器
如圖 copy → paste 然后右鍵屬性改下你的 ssh ip 保存即可,這樣以后你就可以以文件夾為單位批量登錄了。
其實在 %AppData%\Roaming\VanDyke\Config\Sessions 下面保存了這些 session 的配置文件,原本應該是可以一條 shell 命令批量創建好這些 session,而不是手動一個個復制粘貼修改的,只是現在它的 session 配置里有兩處加密了,無法直接這么干。。。
3、自動登錄的原理
其實對于在 shell 下寫過自動登錄認證或者命令行交互的同學來說,這個應該不算陌生,常用的 expect 命令和上面的類似,都是通過捕獲、匹配標準輸出中的提示符關鍵詞,然后發送預定義的字符串或者執行預定義的命令,例如下面的代碼是 expect 實現 ssh 自動登錄并做簡單交互:
#!/usr/bin/expect # 設置超時時間為 60 秒 set timeout 60 # 設置要登錄的主機 IP 地址 set host 192.168.1.46 # 設置以什么名字的用戶登錄 set name root # 設置用戶名的登錄密碼 set password 123456 #spawn 一個 ssh 登錄進程 spawn ssh $host -l $name # 等待響應,第一次登錄往往會提示是否永久保存 RSA 到本機的 know hosts 列表中;等到回答后,在提示輸出密碼;之后就直接提示輸入密碼 expect { "(yes/no)?" { send "yes\n" expect "assword:" send "$pasword\n" } "assword:" { send "$password\n" } } expect "#" # 下面測試是否登錄到 $host send "uname\n" expect "Linux" send_user "Now you can do some operation on this terminal\n" # 這里使用了 interact 命令,使執行完程序后,用戶可以在 $host 終端進行交互操作。 Interact
4、使用 logon script 腳本登錄
文初提到的 logon action 也許對某些業務場景而言過于簡單,你可能需要更強大的功能擴展,secureCRT 也為你提供了這樣的功能,在 session 屬性里勾選 logon script 然后會自動加載執行相應的腳本,這樣可以完成更強大的交互過程,默認情況下在你的 C:\Program Files\SecureCRT\scripts 目錄下會有一些示例腳本,比如 example1.vbs 就是模擬登陸的,目前支持的語言有:python、perl、vbs、vbe、js
############################################################ #$language = "VBScript" #$interface = "1.0" Sub main ' turn on synchronous mode so we don't miss any data crt.Screen.Synchronous = True crt.Screen.WaitForString "ogin:" crt.Screen.Send "test" & VbCr crt.Screen.WaitForString "assword:" crt.Screen.Send "testtest" & VbCr crt.Screen.WaitForString ">>" crt.Screen.Send "telnet 212.75.30.146" & VbCr crt.Screen.WaitForString "ogin:" crt.Screen.Send "test" & VbCr crt.Screen.WaitForString "assword:" crt.Screen.Send "haha" & VbCr 'crt.Screen.Send "export TERM=vt100" & VbCr crt.Screen.Send "ksh" & VbCr crt.Screen.Send "set -o vi" & VbCr crt.Screen.Send "stty erase ^H" & VbCr ' turn off synchronous mode for normal input processing crt.Screen.Synchronous = False End Sub ############################################################
5、SecureCRT 的其它極具生產力特性:
SecureCRT 作為一款功能完備的終端管理軟件,除了上面的功能之外,還有其它一些極具生產力的功能,用好了能極大提升大家的工作效率,我這里摘錄一些,大家如果還有其它的技巧點也可以補充,多多益善~
Refer:
[1] expect 使用
http://blog.chinaunix.net/uid-25063573-id-2956675.html
[2] 非死book元老王淮談科技公司應有的工具文化
http://www.infoq.com/cn/news/2012/08/非死book-tools-culture
[3] 《打造非死book》讀書筆記