首頁 > 環境與工具程式 > expect

expect:自動化互動式程式的腳本

`expect` 是一個強大的 Tcl 擴展,用於自動化與互動式程式的互動。它允許您將需要使用者輸入的命令腳本化,以便自動執行。它主要用於在腳本中控制 `ssh`、`ftp`、`passwd` 等命令。

概述

`expect` 透過等待預定義的模式(例如提示字串)然後發送特定字串(例如使用者輸入)來自動化互動式會話。這使您能夠在無需手動干預的情況下執行複雜的任務。

主要特點

  • 基於 Tcl 的腳本語言擴展
  • 自動化與互動式程式(例如 ssh、ftp、telnet)的互動
  • 提示字串模式匹配和響應發送功能
  • 適用於自動化重複性和手動任務

主要選項

這些選項控制 `expect` 命令本身的執行方式。它們與腳本內部使用的 `expect` 和 `send` 命令不同。

執行控制和調試

生成的命令:

請試著組合命令。

這個 Django 應用程序是一個技術指南文檔,旨在為用戶輕鬆解釋 Linux 的各種命令。

`expect` 執行命令。

請將上述選項組合在一起,與 AI 一同虛擬執行命令。

安裝

`expect` 通常不包含在大多數 Linux 發行版中,因此您需要透過套件管理器進行安裝。

Debian/Ubuntu

sudo apt update && sudo apt install expect

使用 APT 套件管理器安裝 `expect`。

RHEL/CentOS/Fedora

sudo dnf install expect

使用 DNF(或 Yum)套件管理器安裝 `expect`。

使用範例

`expect` 腳本通常具有 `.exp` 副檔名,並以 `#!/usr/bin/expect` 開頭,以便由 `expect` 解譯器執行。

簡單的提示自動回應

#!/usr/bin/expect
set timeout 10
spawn sh -c "echo -n 'Proceed? (y/n) '
read response"
expect "Proceed? (y/n) "
send "y\r"
expect eof

一個自動回答類似 `Proceed? (y/n)` 問題的腳本,輸入 'y'。(為方便範例,使用 `sh`)

SSH 登錄自動化(安全警告)

#!/usr/bin/expect
set timeout 20
set username "your_user"
set hostname "your_host"
set password "your_password"

spawn ssh $username@$hostname
expect "password:"
send "$password\r"
expect "$"
send "ls -l\r"
expect "$"
send "exit\r"
expect eof

一個自動登錄遠端伺服器並執行命令的 SSH 範例。**在腳本中直接包含密碼非常不安全,強烈不建議在實際環境中使用。**

passwd 命令自動化(安全警告)

#!/usr/bin/expect
set timeout 10
set old_pass "old_password"
set new_pass "new_password"

spawn passwd
expect "目前密碼:"
send "$old_pass\r"
expect "新密碼:"
send "$new_pass\r"
expect "請再次輸入新密碼:"
send "$new_pass\r"
expect eof

一個使用 `passwd` 命令自動更改密碼的範例。**在腳本中硬編碼密碼非常不安全。**

提示與注意事項

`expect` 腳本功能強大,但為了安全和穩定性,您需要考慮一些注意事項。

主要提示

  • **密碼安全**:在腳本中硬編碼密碼非常危險。請考慮使用環境變數、安全的設定檔或 `ssh-agent` 等其他安全機制。
  • **超時設定**:使用 `set timeout` 命令設定 `expect` 等待特定模式的最大時間。預設值為 10 秒,您可以設定 `set timeout -1` 以無限期等待。
  • **精確的模式匹配**:`expect` 支援正規表達式。提示字串可能不完全匹配,因此請使用靈活的模式或利用 `*` 萬用字元。
  • **調試**:使用 `expect -d your_script.exp` 命令以調試模式執行,可以詳細查看 `expect` 在等待什麼模式以及發送什麼字串。
  • **使用 `interact`**:當您想在腳本執行過程中將控制權交還給使用者時,可以使用 `interact` 命令。

相同類別命令