Linux Shell自動交互 — expect

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 的簡單使用。


技 術 無 他, 唯 有 熟 爾。
知 其 然, 也 知 其 所 以 然。
踏 實 一 些, 不 要 着 急, 你 想 要 的 歲 月 都 會 給 你。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章