Shell腳本-expect

一、前言

在 Linux 系統管理與自動化運維中,我們經常需要編寫 Shell 腳本來完成各種任務。但有些命令(如 sshscppasswdftp 等)在執行時會等待用戶手動輸入密碼或確認信息,這就導致腳本無法完全自動化運行。

為了解決這個問題,我們可以使用一個強大的工具 —— expect

本文將帶你深入理解 expect 的工作原理,并通過多個實用案例,教你如何在 Shell 腳本中使用 expect 實現自動應答、自動登錄、自動傳輸文件等交互式操作

二、什么是?expect

expect 是一個基于 Tcl(Tool Command Language)語言的自動化交互程序,能夠“模擬”用戶輸入,自動響應命令行中的提示信息(如密碼輸入、確認提示等),從而實現腳本的全自動運行。

? 適用場景:

  • 自動 SSH 登錄遠程服務器
  • 自動 SCP 文件傳輸
  • 自動修改用戶密碼
  • 自動與 FTP/Telnet 等交互式程序通信

三、安裝?expect

大多數 Linux 發行版默認不安裝 expect,需要手動安裝。

Ubuntu / Debian:

sudo apt-get update
sudo apt-get install expect

CentOS / RHEL / Fedora:

sudo yum install expect
# 或者使用 dnf(較新版本)
sudo dnf install expect

安裝完成后,可通過以下命令驗證是否成功:

expect -v
# 輸出類似:expect version 5.45.4

四、expect?基本語法

expect 腳本的基本結構如下:

#!/usr/bin/expectset timeout <秒數>
spawn <要執行的命令>
expect "<期望出現的提示符>"
send "<發送的響應內容>\r"
expect eof

關鍵命令說明:

命令說明
spawn啟動一個新的進程(如 ssh、scp 等)
expect等待某個輸出字符串(提示符、密碼提示等)
send向進程發送字符串(如密碼、回車等)
set timeout設置等待超時時間(-1 表示永不超時)
expect eof等待進程結束
interact將控制權交還給用戶(用于部分自動化)

💡 注意:send 發送的內容末尾通常要加上 \r(回車符),相當于按下回車鍵。

五、實戰案例

? 案例 1:自動 SSH 登錄遠程服務器

#!/usr/bin/expectset timeout 30
set host "192.168.1.100"
set user "root"
set password "your_password"spawn ssh $user@$hostexpect {"yes/no" { send "yes\r"; exp_continue }"password:" { send "$password\r" }
}expect "#"
interact

📌 說明:

  • 使用?expect {}?處理多種可能的提示(如首次連接時的 yes/no)。
  • exp_continue?表示繼續等待下一個匹配。
  • interact?表示登錄成功后將終端控制權交給用戶。

? 案例 2:自動 SCP 傳輸文件

#!/usr/bin/expectset timeout 30
set host "192.168.1.100"
set user "root"
set password "your_password"
set local_file "/tmp/data.txt"
set remote_path "/root/"spawn scp $local_file $user@$host:$remote_pathexpect {"yes/no" { send "yes\r"; exp_continue }"password:" { send "$password\r" }
}expect eof

📌 說明:

  • 文件傳輸完成后,expect eof?等待進程結束。
  • 適用于定時備份、批量部署等場景。

? 案例 3:Shell 腳本中調用?expect

你可以在普通的 Shell 腳本中嵌入 expect 腳本,實現混合編程:

#!/bin/bashHOST="192.168.1.100"
USER="root"
PASS="your_password"expect << 'EOF'
set timeout 30
spawn ssh $env(USER)@$env(HOST)
expect {"yes/no" { send "yes\r"; exp_continue }"password:" { send "$env(PASS)\r" }
}
expect "#"
send "uptime\r"
sleep 1
send "exit\r"
expect eof
EOF

📌 技巧:

  • 使用?<< 'EOF'?將 expect 腳本作為 here-document 嵌入。
  • 通過?$env(VAR)?獲取 Shell 變量(需在 expect 中啟用環境變量傳遞)。

六、常見問題與解決方案

? 問題 1:expect: command not found

原因:系統未安裝 expect 或路徑錯誤。

解決

which expect  # 查看是否安裝
# 若未安裝,請使用包管理器安裝

? 問題 2:密碼錯誤或登錄失敗未捕獲

建議:增加錯誤處理機制:

expect {"yes/no" { send "yes\r"; exp_continue }"password:" { send "$password\r" }timeout { puts "連接超時"; exit 1 }eof { puts "連接失敗或主機不可達"; exit 1 }
}

? 問題 3:中文亂碼或特殊字符問題

解決:確保終端編碼一致,或避免在 send 中使用特殊字符。可使用 stty 調整終端設置。

七、安全建議 ??

雖然 expect 很強大,但在生產環境中使用時需要注意以下安全問題:

  1. 避免明文存儲密碼
    將密碼寫在腳本中存在泄露風險。建議:

    • 使用 SSH 免密登錄(公鑰認證)
    • 使用?ssh-agent?或密鑰管理工具
  2. 限制腳本權限
    設置腳本權限為 600,僅允許所有者讀寫:

    chmod 600 auto_ssh.exp
  3. 使用配置文件替代硬編碼
    將主機、用戶名、密碼等信息放在獨立的配置文件中,并加密保護。

八、總結

功能工具說明
自動交互expect模擬用戶輸入,實現自動化
啟動進程spawn執行需要交互的命令
匹配輸出expect等待特定提示
發送輸入send發送密碼、命令等
超時控制set timeout防止無限等待

? 優點:簡單高效,適用于各種交互式命令。 ? 缺點:明文密碼有安全隱患,建議結合 SSH 密鑰使用。

九、結語

感謝您的閱讀!如果你有任何疑問或想要分享的經驗,請在評論區留言交流!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/94532.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/94532.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/94532.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Conmi的正確答案——Ubuntu24.04禁用任何休眠

系統&#xff1a;Ubuntu 24.04步驟一、禁用系統休眠服務 # 禁用所有休眠/待機相關服務&#xff08;立即生效&#xff09; sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target # 驗證狀態&#xff08;顯示 "masked" 即成功&am…

開源 C++ QT Widget 開發(二)基本控件應用

文章的目的為了記錄使用C 進行QT Widget 開發學習的經歷。臨時學習&#xff0c;完成app的開發。開發流程和要點有些記憶模糊&#xff0c;趕緊記錄&#xff0c;防止忘記。 相關鏈接&#xff1a; 開源 C QT Widget 開發&#xff08;一&#xff09;工程文件結構-CSDN博客 開源 C…

今日科技風向|從AI芯片定制到閱兵高科技展示——聚焦技術前沿洞察

今日科技風向&#xff5c;從AI芯片定制到閱兵高科技展示——聚焦技術前沿洞察 一、NVIDIA 開發“黑曜”子版 AI 芯片 B30A&#xff0c;瞄準中國市場 今日報道指出&#xff0c;NVIDIA 正在研發一款面向中國市場的定制芯片 B30A&#xff0c;基于其先進的 Blackwell 架構&#xff…

Elasticsearch官方文檔學習-未完待續

Elasticsearch官方文檔學習-未完待續說明快速開始基礎知識索引組成1. 文檔 (Documents)2. 元數據字段(Metadata fields)3. 映射和數據類型(Mappings and data types)文檔操作(Document)批量創建或者刪除文檔 (Bulk index or delete documents)樂觀并發控制 Optimistic concurre…

Redis資料

Redis是什么&#xff1f; Redis(Remote Dictionary Server)是一個開源的、基于內存的鍵值數據庫&#xff0c;支持多種數據結構&#xff0c;可用作數據庫、緩存和消息中間件。主要特點包括&#xff1a; 基于內存操作&#xff0c;讀寫性能極高支持持久化&#xff0c;可將內存數…

CAMEL-Task2-Agent的構成組件

CAMEL-Task2-Agent的構成組件 本文筆記主要關于2.7章節&#xff1a;CAMEL框架中agents如何使用工具。 一、工具說明 為什么要額外使用工具&#xff1f; agents本身的知識和能力有限&#xff0c;比如一些問題需要聯網搜索才能準確回答&#xff08;而不是亂答&#xff0c;即“…

數據整理自動化 - 讓AI成為你的數據助手

文章目錄數據整理自動化 - 讓AI成為你的數據助手引言&#xff1a;數據整理的時代挑戰與機遇1. 常見數據整理場景分析1.1 數據整理的多元場景圖譜1.2 數據質量問題的分類與影響1.3 傳統處理方法的局限性2. AI與傳統腳本的協同工作流2.1 智能數據整理架構設計2.2 協同工作流的最佳…

react速成

項目目錄package.json文件&#xff1a;包含核心兩個依賴&#xff08;react、react-dom&#xff09;和命令&#xff08;start、bulid&#xff09;src&#xff1a;源碼目錄&#xff0c;開始之用的到index.js和App.jsindex.js&#xff1a;是項目的入口&#xff0c;一切的運行起點/…

Maven的進階使用(上)

pom.xml文件 就像 Make 的 MakeFile、Ant 的 build.xml 一樣&#xff0c;Maven 項目的核心是 pom.xml。POM(全稱 Project Object Model&#xff0c;項目對象模型 ) 定義了項目的基本信息&#xff0c;用于描述項目如何構建&#xff0c;聲明項目依賴&#xff0c;等等。 Gredele--…

【最后203篇系列】034 使用SQLite構建簡單的任務管理

表數據同步的斷點續傳 有時候需要將一個表的數據復制到另一個表&#xff0c;循環是常用的方式。當表比較大&#xff0c;執行的時間很長&#xff0c;會有很多因素引起失敗。我希望可以比較簡單的跑數&#xff0c;所以做一個簡單的任務系統。 SQLitre是嵌入式數據庫&#xff0c;這…

SpringCloud Alibaba核心知識點

Spring Cloud Alibaba 是阿里巴巴開源的一套微服務解決方案&#xff0c;與 Spring Cloud 生態深度集成。以下是其主要組件及其功能&#xff1a;Nacos服務注冊與發現&#xff1a;支持動態服務注冊、健康監測及DNS-Based服務發現。配置中心&#xff1a;提供分布式配置管理&#x…

LeetCode 分類刷題:34. 在排序數組中查找元素的第一個和最后一個位置

題目給你一個按照非遞減順序排列的整數數組 nums&#xff0c;和一個目標值 target。請你找出給定目標值在數組中的開始位置和結束位置。如果數組中不存在目標值 target&#xff0c;返回 [-1, -1]。你必須設計并實現時間復雜度為 O(log n) 的算法解決此問題。示例 1&#xff1a;…

自建知識庫,向量數據庫 (十二)之 文章向量搜索——仙盟創夢IDE

“未來之窗” 文章向量搜索&#xff1a;多領域應用與學習指南 在數字化浪潮中&#xff0c;“未來之窗” 文章向量搜索憑借其獨特的技術優勢&#xff0c;在酒店、電商、診療及知識庫等多個領域展現出巨大的應用潛力&#xff0c;為各行業的信息處理與檢索帶來了全新的視角和高效…

深度剖析:基于反射的.NET二進制序列化器設計與實現

&#x1f50d; 深度剖析&#xff1a;基于反射的.NET二進制序列化器設計與實現本文將從底層原理到高級優化&#xff0c;全面剖析一個基于反射的.NET二進制序列化器的設計與實現&#xff0c;涵蓋類型系統處理、內存布局、遞歸算法、性能優化等核心主題。1. 設計哲學與架構總覽 1.…

如何在 Ubuntu 上安裝和配置 Samba ?

Samba 是一個開源程序&#xff0c;用于文件共享和網絡打印&#xff0c;使用 SMB 協議。現在基本上用于提供在 Windows 上可訪問的 Linux 文件共享系統。 本文介紹如何在 Ubuntu 上安裝和配置 Samba 服務器&#xff0c;以便跨文件夾共享網絡上不同的計算機。 Update Your Syst…

MATLAB實現CNN-GRU-Attention時序和空間特征結合-融合注意力機制混合神經網絡模型的風速預測

該 MATLAB 代碼實現了一個基于 CNN-GRU-Attention 時序和空間特征結合-融合注意力機制混合神經網絡模型的風速預測。以下是對代碼的簡要分析&#xff1a;一、主要功能 該代碼用于風速時間序列預測&#xff0c;使用歷史風速特征數據&#xff08;18個特征&#xff0c;75天&#x…

【升級版】從零到一訓練一個 0.6B 的 MoE 大語言模型

前文&#xff1a;從零到一訓練一個 0.6B 的 MoE 大語言模型&#xff0c;本次升級完全重新從零開始重新訓練。主要升級如下&#xff1a; 替換預訓練數據集&#xff0c;使用序列猴子通用文本數據集進行預訓練。使用更先進的訓練方法。新增思考模式控制&#xff0c;可通過添加/th…

51單片機-實現定時器模塊教程

本章概述思維導圖&#xff1a; 51單片機驅動定時器模塊 CPU時序簡介 CPU時序定義了CPU內部操作的時間節奏&#xff0c;以下從四個時序周期進行逐步解析&#xff1b; 1、振蕩周期 振蕩周期&#xff1a;CPU內部時鐘源產生的最小時間單位&#xff0c;由晶振或內部振蕩器決定&am…

7.Kotlin的日期類

以下是 Kotlin 中常用時間類&#xff08;基于 java.time 包&#xff09;的核心方法及使用示例&#xff0c;參考數組方法的表格形式&#xff0c;按類分類展示&#xff1a; 一、LocalDate&#xff08;日期&#xff1a;年/月/日&#xff09;方法簽名返回值說明示例now(): LocalDat…

【Big Data】Hive技術解析:大數據倉庫的SQL橋梁

Hive作為Apache頂級項目&#xff0c;是Hadoop生態系統中最具影響力的SQL查詢引擎&#xff0c;它解決了大數據處理與傳統SQL技能之間的鴻溝。Hive的核心價值在于將類SQL查詢語言HiveQL無縫轉換為分布式計算框架MapReduce的任務&#xff0c;使數據分析師能夠利用熟悉的SQL語法操作…