expect是一個免費的編程工具,用來實現自動的交互式任務,而無需人爲干預。
注意:在使用之前需要安裝 expect
1、expect基礎
在使用 expect 時,我們基本是操作下面幾個命令:
命令 | 作用說明 |
---|---|
spawn | 啓動新進程 |
expect | 從進程接收字符串 |
send | 用於向進程發送字符串 |
interact | 用於退出自動化,進入人工交互 |
2、根據需求場景,學習用法
2.1、需求1:使用腳本自動切換到 root 用戶,無需人工干預。
2.1.1、代碼實現
#!/usr/bin/expect
set timeout 2
spawn su root
expect "*password*"
send "123\r"
interact
2.1.2、代碼分析
- #!/usr/tcl/bin/expect:使用expect來解釋該腳本,就像 sh 腳本寫的 #!/bin/bash 類似。
- set timeout 2:設置超時時間,單位爲秒。如果不寫,默認情況下是10秒。
- spawn su root:spawn 是 expect 的內部命令,啓動一個線程去執行命令,執行的命令就是"su root"。
- expect “password”: expect 也是 expect 的內部命令,判斷上面執行的命令後輸出結果裏是否包含“password”的字符串,如果有則立即返回;否則就等待一段時間後返回,這裏等待時長就是前面設置的timeout 時長。爲什麼要寫 “password” 呢?因爲上面 "su root"命令執行後,會要求用戶輸入密碼,所以這裏用了password,前後還加了通配符(加通配符是我的習慣,這裏不加也可以)。
- send “123\r”:當匹配到對應的輸出結果時,就發送密碼到打開的ssh進程,執行交互動作。
- interact:執行完成後保持交互狀態,把控制權交給控制檯,這個時候就可以手工操作了。如果不加這一句,命令完成後就會馬上退出到普通用戶,不會停留在root 用戶。
2.2、需求2:使用腳本自動修改 root 用戶的密碼,無需人工干預。
2.2.1、代碼實現
#!/usr/bin/expect
set timeout 2
spawn sudo passwd root
expect "*password*"
send "123\r"
expect "*password*"
send "123\r"
interact
2.2.2、代碼分析
這段代碼與上面那段代碼格式差不多,差別在於這段代碼寫了兩遍 expect 和 send。爲什麼呢?
原因是在平時在修改密碼的時候,會讓我們輸入兩次密碼,第一次是新的密碼,第二次是確認密碼,所以這裏第一組 expect 和 send 是完成的新的密碼的輸入操作,第二組 expect 和 send 是完成了確認密碼的操作。
以上就是 expect 的簡單使用。
技 術 無 他, 唯 有 熟 爾。
知 其 然, 也 知 其 所 以 然。
踏 實 一 些, 不 要 着 急, 你 想 要 的 歲 月 都 會 給 你。