一個自動登錄的腳本
最近經常要登錄伺服器做一些事情,每次都要輸入密碼,一次兩次還行,時間長了就覺得麻煩了。於是乎就在想我得寫個自動登錄伺服器的腳本。
查了下發現 shell 里有一個 expect 命令可以干這個事。expect 就是專門用來處理人機交互邏輯的腳本,也就是說 expect 可以識別系統的提示,根據提示來執行相應的命令。
接下來我們了解一下 expect 這個命令。expect 的整個流程就是通過 spawn 來起一個新的進程來干一件事,然後通過 expect 來監聽程序的提示信息,監聽到特定的信息以後,通過 send 命令來執行下一步的操作,然後再通過 expect 來監聽下一次的提示信息直到運行結束,這時候可以退出進程或者通過 interact命令來把終端的控制權交給用戶,讓用戶執行其他的操作。
回到剛才的需求,我們結合 expect 很容易寫出一個簡單的自動登錄腳本來。
#!/usr/local/bin/expect
spawn ssh mingming@x.x.x.x
expect Password:
send xxxxxx
interact
我們發現這個腳本,一直停留再 Password: 提示這,並不會出現我們預期的登錄成功的提示,當我們自己敲了一下回車的時候才出現登錄成功的提示。原來我們少了一個回車。那麼 expect 該怎麼添加回車呢?查看文檔知道
是回車的標誌。那麼我們可以改一下第四行 send xxxxxx
. 然後再試一下,這次出現了登錄成功的提示了。當我再寫這個腳本的時候被密碼的內容坑了一下,由於密碼是隨機生成的裡面有 ; 這些特殊字元,導致總是登錄不成功。知道這個以後給這些特定的字元轉義一下就 OK 了。
其實在查看 expect 文檔的過程中其實官方是不推薦用這個寫自動登錄腳本的,原因是安全性不夠高。密碼明文寫在腳本里,很容易泄漏出去。官方建議是根據密碼提示來填寫密碼,如果是在沒辦法也是可以用這種方式的。但是回過頭來我們可以想一想我們可以有哪些方面來維護這個密碼的安全性呢?關於這個問題還是得從容易泄漏的原因出發,容易泄露的原因無非就是腳本安全性不夠高,密碼明文存儲到腳本里。那麼就可以從這兩方面著手改進這個問題,1: 腳本加密,2:密碼不明文存儲,通過代碼邏輯或其他方式來獲取密碼
最後總結一下 expect 相關的點。
1: 通過 spawn 喚起一個新的進程來執行相關邏輯,只有通過 spawn 喚起的進程的提示信息才能被 expect 捕獲到。
2: expect 是用來監聽程序的提示信息,可以同時監聽多個不同的提示信息,並且支持正則匹配。這個應該寫的越全越好。
3: send 是給程序一段輸入。裡面需要注意特殊字元的轉義問題,以及回車的問題。
4: interact 是把進程的控制權交給用戶,由用戶執行其他的命令。
TAG:明明的學習筆記 |