1. 程式人生 > 其它 >巧用 SecureCRT 實現複雜的 ssh 登入過程自動化

巧用 SecureCRT 實現複雜的 ssh 登入過程自動化

以前公司的伺服器都是在 SecureCRT 裡直接 ssh 連線,但是最近公司處於安全審計考慮,在所有伺服器前加了一層堡壘機,而且密碼採用 kerberos 集中授權認證。這樣問題就來了,雖然安全審計的目的達到了,但是登入伺服器的效率卻大打折扣,以前點一次滑鼠就登入的過程,現在還要手動輸入3次命令或密碼才能完成。機器少還好,多的話,這個體驗和流程對於追求效率的 RD 來說苦不堪言。記得在《打造 Facebook》一書中也曾提到了 Facebook 的工具文化,其中一條是說凡是被很多人不斷重複的好的習慣,都要將其自動化。推而廣之,那麼這裡究竟有沒有辦法自動化這個登入過程呢?

其實 SecureCRT 本身就可以實現,SecureCRT 的 Logon Action 可以在登入過程中傳送指令去完成許可權校驗實現自動登入。你只需要把整個複雜登入認證流程走一遍,把其中的關鍵提示文字記下來,然後根據流程順序建立相應的 Action 即可。

1、自動登入單臺伺服器

先看圖,後面我會說原理。

2、批量登入多臺伺服器

如圖 copy → paste 然後右鍵屬性改下你的 ssh ip 儲存即可,這樣以後你就可以以資料夾為單位批量登入了。

其實在 %AppData%RoamingVanDykeConfigSessions 下面儲存了這些 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 "yesn"
        expect "assword:"
        send "$paswordn"
    }
        "assword:" {
        send "$passwordn"
    }
 }
 expect "#"
 # 下面測試是否登入到 $host
 send "unamen"
 expect "Linux"
 send_user  "Now you can do some operation on this terminaln"
 # 這裡使用了 interact 命令,使執行完程式後,使用者可以在 $host 終端進行互動操作。
 Interact

4、指令碼自動登入:應對繁瑣多變的互動式登入場景

文初提到的 logon action 也許對某些業務場景而言過於簡單,你可能需要更強大的功能擴充套件,比如每個月公司會強制要求修改Kerboros密碼,上百臺機器都需要變更一次,這在文初的方案中是非常繁瑣費事的,secureCRT 也為你提供了這樣的功能,在 session 屬性裡勾選  logon script 然後會自動載入執行相應的指令碼,這樣可以完成更強大的互動過程,預設情況下在你的 C:Program FilesSecureCRTscripts 目錄下會有一些示例指令碼,比如 example1.vbs 就是模擬登陸的,目前支援的語言有:python、perl、vbs、vbe、js。

下面的例子是把 kerboros 密碼儲存在檔案中,登入指令碼會自動根據標題 IP 去匹配密碼,然後執行自動登入,這樣每次系統改密碼後只需修改檔案中的密碼,所有機器配置不用任何修改即可正常登入。

注意: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:UsersJunDesktoppasswd.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

5、SecureCRT 的其它極具生產力特性:

SecureCRT 作為一款功能完備的終端管理軟體,除了上面的功能之外,還有其它一些極具生產力的功能,用好了能極大提升大家的工作效率,我這裡摘錄一些,大家如果還有其它的技巧點也可以補充,多多益善~

Refer:

[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

https://forums.vandyke.com/archive/index.php/t-1525.html

https://www.vandyke.com/support/tips/scripting/index.html