Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Shell 自動交互三大絕技:Here Document、Pipe 與 Expect 實戰比較

編輯:Linux 教學

前言

Shell 腳本常需與互動式程式(ftp、telnet、passwd、su 等)自動對話。本文系統整理三種主流自動交互技術——Here Document(重導向)、Pipe(管道+sleep)、Expect 專用工具——並以實際需求場景實測比較優劣,助你按場景選對工具。

一、場景需求

  1. FTP 自動登入並操作:免輸入帳密、自動切目錄、列檔案。
  2. 非互動修改密碼:批量更新使用者密碼,無需手動輸入新舊密碼。
  3. SU 免密切換 Root:腳本中自動提權至 root。

二、方法一:Here Document(<<EOF)

原理:Shell 將分隔符之間的內容作為標準輸入餵給命令。

適用:FTP、Telnet 等讀取 stdin 的互動程式

#!/bin/bash
ftp -i -n 192.168.167.187 << EOF
user hzc 123456
pwd
cd test
pwd
close
bye
EOF

優缺點

  • ✅ 語法直觀、無額外依賴
  • ❌ 僅能餵固定輸入,無法根據程式回應動態判斷
  • ❌ 遇到「standard in must be a tty」錯誤時無效(如 su、passwd)

三、方法二:Pipe + Echo + Sleep

原理:用 echo 產生輸入,配合 sleep 等待程式提示,經管道傳給命令。

適用:簡單單向輸入的程式(如 passwd)

#!/bin/bash
(
echo "curpassword"
sleep 1
echo "newpassword"
sleep 1
echo "newpassword"
) | passwd

優缺點

  • ✅ 極簡單、無需安裝套件
  • ❌ 時序靠 sleep 硬等,不穩定(負載高時提示延遲會失敗)
  • ❌ 無法處理「需 tty」的程式(su、sudo)

四、方法三:Expect 專用自動化工具

原理:基於 Tcl 的自動化互動套件,能模式匹配程式輸出並發送對應回應,支援分支、迴圈、逾時等完整邏輯。

適用:所有需 tty、需動態判斷的複雜互動(su、ssh、ftp 斷點續傳等)

#!/usr/bin/expect
spawn su root
expect "password: "
send "123456\r"
expect eof
exit

優缺點

  • ✅ 功能最強、可靠性最高、支援複雜邏輯
  • ❌ 需額外安裝 expect 套件(嵌入式環境可能無法安裝)
  • ❌ 學習曲線稍高(需了解 Tcl 基礎語法)

五、三大方法對照表

維度Here DocumentPipe + SleepExpect
依賴內建內建需安裝 expect
適用程式讀 stdin 的 ftp/telnet/sftp簡單單向輸入的 passwd 等所有(含 su、ssh、sudo)
動態判斷無無強(expect 模式匹配)
穩定性高(固定流程)低(靠 sleep)高
複雜度低低中

六、最佳實踐建議

  1. FTP/SCP 批量傳檔:優先 lftp 或 sshpass + rsync,比 Here Document 更健壯。
  2. 修改密碼:生產環境請用 chpasswd 或 echo "user:pass" | chpasswd,比 Pipe 更標準。
  3. SU/SUDO 提權:腳本建議直接以 root 執行,或配置 sudoers NOPASSWD;必須互動時才用 Expect。
  4. SSH 自動登入:首選 金鑰認證(ssh-copy-id),非萬不得已勿用 Expect 存密碼。

總結

Here Document 適合固定流程的 stdin 程式;Pipe+Sleep 只能應急簡單場景;Expect 是處理複雜互動的終極武器。實務上能避免互動就避免(改用參數、金鑰、設定檔),必須互動時再按複雜度選工具。

Copyright © Windows教程網 All Rights Reserved