之前公司的服務器都是在 SecureCRT 裏直接 ssh 鏈接,可是最近公司處於安全審計考慮,在全部服務器前加了一層堡壘機,並且密碼採用 kerberos 集中受權認證。這樣問題就來了,雖然安全審計的目的達到了,可是登陸服務器的效率卻大打折扣,之前點一次鼠標就登陸的過程,如今還要手動輸入3次命令或密碼才能完成。機器少還好,多的話,這個體驗和流程對於追求效率的 RD 來講苦不堪言。記得在《打造 Facebook》一書中也曾提到了 Facebook 的工具文化,其中一條是說凡是被不少人不斷重複的好的習慣,都要將其自動化。推而廣之,那麼這裏究竟有沒有辦法自動化這個登陸過程呢?php
其實 SecureCRT 自己就能夠實現,SecureCRT 的 Logon Action 能夠在登陸過程當中發送指令去完成權限校驗實現自動登陸。你只須要把整個複雜登陸認證流程走一遍,把其中的關鍵提示文本記下來,而後根據流程順序建立相應的 Action 便可。html
先看圖,後面我會說原理。python
如圖 copy → paste 而後右鍵屬性改下你的 ssh ip 保存便可,這樣之後你就能夠以文件夾爲單位批量登陸了。shell
其實在 %AppData%\Roaming\VanDyke\Config\Sessions 下面保存了這些 session 的配置文件,本來應該是能夠一條 shell 命令批量建立好這些 session,而不是手動一個個複製粘貼修改的,只是如今它的 session 配置裏有兩處加密了,沒法直接這麼幹。。。安全
其實對於在 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
文初提到的 logon action 也許對某些業務場景而言過於簡單,你可能須要更強大的功能擴展,好比每月公司會強制要求修改Kerboros密碼,上百臺機器都須要變動一次,這在文初的方案中是很是繁瑣費事的,secureCRT 也爲你提供了這樣的功能,在 session 屬性裏勾選 logon script 而後會自動加載執行相應的腳本,這樣能夠完成更強大的交互過程,默認狀況下在你的 C:\Program Files\SecureCRT\scripts 目錄下會有一些示例腳本,好比 example1.vbs 就是模擬登錄的,目前支持的語言有:python、perl、vbs、vbe、js。session
下面的例子是把 kerboros 密碼保存在文件中,登陸腳本會自動根據標題 IP 去匹配密碼,而後執行自動登陸,這樣每次系統改密碼後只需修改文件中的密碼,全部機器配置不用任何修改便可正常登陸。ssh
注意:kerboros 和 SecureCRT 最好以管理員權限啓動,不然會有各類莫名其妙問題,好比仍是提示讓你輸入密碼。工具
#$language = "VBScript" #$interface = "1.0" Sub main ' Constant used by OpenTextFile() Const ForReading = 1 ' Open a file, read it in & send it one line at a time Dim fso, f, passwd Set fso = CreateObject("Scripting.FileSystemObject") ' 請把密碼保存在這個文件裏,注意修改成本身的路徑 Set f = fso.OpenTextFile("C:\Users\Jun\Desktop\passwd.txt", ForReading, 0) Do While f.AtEndOfStream <> True ' Read each line of the printers file. passwd = f.Readline Exit Do Loop ' Get ipAddress from current tabName caption = crt.window.caption Set re = New RegExp re.Global = True re.IgnoreCase = True re.MultiLine = True key = "(?:1?\d?\d|2[0-4]\d|25[0-5])" re.Pattern = "\b" & key & "\." & key & "\." & key & "\." & key & "\b" set ex = re.Execute(caption) For Each e In ex 'str = str & e & vbCrLf ipv4 = e Exit For Next ' Debug 'PrintResult(crt.Dialog.MessageBox("Login Succ...")) ' turn on synchronous mode so we don't miss any data crt.Screen.Synchronous = True ' Wait for a string that looks like "login: " or "Login: " crt.Screen.WaitForString "ogin:" ' Send your cmd or data followed by a carriage return crt.Screen.Send "ssh work@" & ipv4 & VbCr crt.Screen.WaitForString "ermission :" crt.Screen.Send "2" & VbCr crt.Screen.WaitForString "kerberos password :" crt.Screen.Send passwd & VbCr 'crt.Screen.WaitForString "assword:" 'crt.Screen.Send "2" & VbCr ' turn off synchronous mode to restore normal input processing crt.Screen.Synchronous = False End Sub
python 腳本範例:oop
#$language = "Python" #$interface = "1.0" """ author = "decli" last_modify = "2018/08/09" """ # Windows 10 HOME 1803 + SecureCRT 8.3.3 (x64 build 1646) test passed. But xshell is not Compatible kerberos, don't recommend! def open_tab(current_screen, ip, permission) : current_screen.Synchronous = True current_screen.WaitForString("INPUT:", 10) current_screen.Send("{}@{}\n".format(permission, ip)) current_screen.Send(""" type redEcho 2>/dev/null && clear || { redEcho(){ echo -en "\e[41;37;1m$*\e[0m\n" } greenEcho(){ echo -en "\e[42;37;1m$*\e[0m\n" } IP=`ss -4|grep -vE '127.0.0.1|0.0.0.0|Address:Port'|head -1|awk -F" +|:" '{print $5}'` name=$(strings $(set|grep -i krb|awk -F: '{print $2}')|head -2|tail -1) PROMPT_COMMAND="PS1='\[\e[36;1m\]\u\[\e[0m\]@\[\e[33;1m\]$IP \e[40;34;1m\\t \e[0m\[\e[31;1m\]\w \[\e[0m\]>\n'" alias ll='ls -lrt --color=auto' alias lh='ls -ld `pwd`/.[^.]* 2>/dev/null' alias lc='ls -lrct' alias bigdir='du -hx 2>/dev/null|awk "\$1~/G|T/||(\$1~/M/&&\$1+0>300){print \$0\"\057\"}"|sort -k2|awk "{lr=\$0;cs=\$1;cr=\$2;while(getline){if(((cs~/M/&&\$1~/M/)&&(\$1-cs>300||\$1-cs<-300))||((cs~/M/&&\$1~/G/)||cs~/G/&&\$1~/M/)||((cs~/G/&&\$1~/G/)&&(\$1-cs>0.3||\$1-cs<-0.3))||(cs~/T/||\$1~/T/)||\$2!~cr){print lr};lr=\$0;cs=\$1;cr=\$2};print lr}"|grep --color -P "(^[\d\.]+[GT].*)|\t"' pywget(){ [[ $1 == "" ]] && redEcho "Usage: pywget [port] filename||dir" && return 127 port_filename_arr=(`echo|awk -va=$1 -vb=$2 '{if(b==""){print "8000 "a}else{print (a<1024||a>65535)?"8000 "b:a" "b}}'`) port=${port_filename_arr[0]}; filename=${port_filename_arr[1]} [[ $ip2 == "" ]] && ip2=$IP redEcho "\nYou can download your file use the command:\nwget -m -nH http://$ip2:$port/$filename" python -mSimpleHTTPServer $port $filename } [[ -n $name ]] && mkdir -p ~/$name && cd ~/$name clear } """) current_screen.Synchronous = False """ session tab title 統一命名爲:ip-permission 這種形式, 例如 127.0.0.1-work 或者 127.0.0.1-root 或者 127.0.0.1-work-slave """ tab_title = crt.GetScriptTab().Caption ip, permission = __import__("re").split("[^\w\.]", tab_title)[:2] open_tab(crt.GetScriptTab().Screen, ip, permission)
SecureCRT 做爲一款功能完備的終端管理軟件,除了上面的功能以外,還有其它一些極具生產力的功能,用好了能極大提高你們的工做效率,我這裏摘錄一些,你們若是還有其它的技巧點也能夠補充,多多益善~
[1] expect 使用
http://blog.chinaunix.net/uid-25063573-id-2956675.html
[2] Facebook元老王淮談科技公司應有的工具文化
http://www.infoq.com/cn/news/2012/08/facebook-tools-culture
[3] 《打造FACEBOOK》讀書筆記
http://aoxuis.me/post/2013-04-16-facebook-review
[4] securecrt 官方腳本範例參考:
https://www.vandyke.com/support/securecrt/python_examples.html
https://www.vandyke.com/support/securecrt/scripting_faq.html
https://www.vandyke.com/support/securecrt/scripting_examples.html