Shell編程之免交互的實現(xiàn)示例
一,Here Document 免交互
1:Here Document概述
Here Document,簡稱Heredoc,是Shell腳本中一種特殊的輸入重定向方式,允許你插入多行文本到命令中,作為輸入數(shù)據(jù)源。它由一個起始標記界定開始,以相同標記結(jié)束(通常該標記位于一行的開始),并且在結(jié)束標記前可以包含任意文本,甚至是變量和命令的輸出。
2:Here Document 免交互
Heredoc設(shè)計用于簡化向腳本或命令提供多行數(shù)據(jù)的過程,避免了手動輸入或交互式對話的需求,特別適用于自動化腳本的編寫。
(1).通過read命令接收輸入并打印
雖然read
命令直接與Here Document無關(guān),但提到免交互,可以對比說明。常規(guī)使用read
時需要用戶逐行輸入,而使用Heredoc,可以預(yù)先定義好要輸入的多行文本,實現(xiàn)自動化:
# 使用Here Document代替read的交互過程 cat <<EOF This is the first line. This is the second line. EOF
(2).通過passwd給用戶設(shè)置密碼
Here Document在非交互式地設(shè)置用戶密碼時非常有用,避免了手動輸入密碼的步驟:
sudo passwd username <<EOF newPassword123 newPassword123 # 確認密碼 EOF
注意:出于安全考慮,某些系統(tǒng)或版本的passwd
命令可能不接受來自stdin的密碼輸入。
3:Here Document 變量設(shè)定
在Heredoc中,可以方便地插入和使用變量,實現(xiàn)動態(tài)內(nèi)容生成:
greeting="Hello" name="Alice" cat <<EOF ${greeting}, ${name}! EOF
4:Here Document 格式控制
Heredoc支持所有文本格式化控制,包括轉(zhuǎn)義序列(如\n
換行、\t
制表符)和多行文本,適用于生成格式化輸出,如配置文件、HTML等:
#bash cat <<EOF <html> <head> <title>Welcome</title> </head> <body> <h1>Hello, World!</h1> </body> </html> EOF
5:Here Document 多行注釋
盡管不推薦作為主要的注釋方式,但Here Document可以用作多行注釋的一種非傳統(tǒng)方法:
: <<'COMMENT' 這是一個 多行注釋 不會展開變量 COMMENT
注意:使用單引號包圍結(jié)束標記以阻止變量展開,保持注釋內(nèi)容原樣輸出。然而,標準的井號#
仍然是推薦的單行或多行注釋方式。
二,expect 免交互
1:expect 概述
Expect 是一個強大的自動化和測試工具,它使用Tcl語言編寫,專為處理交互式程序設(shè)計,如那些需要用戶輸入密碼或?qū)μ崾咀龀鲰憫?yīng)的程序。通過期望(expect)特定的輸出并發(fā)送(send)相應(yīng)的回復,expect腳本能模擬人類與命令行應(yīng)用程序的交互,從而實現(xiàn)自動化操作,無需人工介入。
2:expect 安裝
在Linux系統(tǒng)中,expect通常作為一個獨立的軟件包存在,可以通過包管理器安裝:
- Debian/Ubuntu:
sudo apt-get install expect
- Fedora/RHEL/CentOS:
sudo yum install expect
或sudo dnf install expect
- macOS: 可以通過Homebrew安裝,
brew install expect
3:基本命令介紹
(1)腳本解釋器
每個expect腳本通常以#!/usr/bin/expect
作為第一行,指定了腳本的解釋器。
(2)expect/send
- expect: 等待從進程接收到的輸出匹配給定的模式,然后執(zhí)行后續(xù)命令。
- send: 向進程發(fā)送字符串,模擬用戶輸入。通常需要
\r
來模擬回車鍵。
(3)spawn
- 用于啟動一個新的子進程,并將該進程與expect腳本連接起來,以便對其進行交互。
(4)結(jié)束符
expect可以使用-exact
, -glob
, -regexp
等選項來指定匹配模式的類型。
(5)set
用于設(shè)置變量,如set variable value
。
(6)exp_continue
在滿足expect條件后,使用exp_continue
可以繼續(xù)執(zhí)行下一次expect,而不是退出當前循環(huán)。
(7)send_user
類似于print或echo,但只輸出到控制臺,不發(fā)送給進程,用于調(diào)試或狀態(tài)反饋。
(8)接收參數(shù)
腳本可以通過1,2等變量獲取命令行參數(shù),如set arg1 [lindex $argv 0]
。
4:expect 語法
(1)語法結(jié)構(gòu)
基本結(jié)構(gòu)包括spawn啟動進程,一系列expect和send交互,以及最后的流程控制。
(2)expect 執(zhí)行方式
腳本可以直接執(zhí)行,或在shell腳本中調(diào)用expect命令執(zhí)行。
5:expect 案例
(1)創(chuàng)建用戶并設(shè)置密碼
#!/usr/bin/expect set username "newuser" set password "secretpassword" spawn useradd $username expect "Enter new UNIX password:" send "$password\r" expect "Retype new UNIX password:" send "$password\r" interact
(2)實現(xiàn)ssh自動登錄
#!/usr/bin/expect set user "remote_username" set host "remote_host" set password "remote_password" spawn ssh $user@$host expect { "(yes/no)?" { send "yes\r"; exp_continue } "password:" { send "$password\r" } } interact
(3)利用 expect 完成 FTP 登錄過程
#!/usr/bin/expect set ftp_server "ftp.example.com" set ftp_user "ftp_username" set ftp_password "ftp_password" spawn ftp $ftp_server expect "Name .*:" send "$ftp_user\r" expect "Password:" send "$ftp_password\r" expect "ftp>" send "ls\r" expect "ftp>" send "quit\r"
這些案例展示了expect在自動化管理任務(wù),如用戶管理、遠程登錄和文件傳輸?shù)确矫娴膹姶蠊δ?,通過模擬用戶交互,實現(xiàn)無須人工干預(yù)的腳本執(zhí)行。
到此這篇關(guān)于Shell編程之免交互的文章就介紹到這了,更多相關(guān)Shell 免交互內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
getcwd cannot access parent directories錯誤解決方法
這篇文章主要介紹了getcwd cannot access parent directories錯誤解決方法,在Linux下執(zhí)行命令時有時會無意中遇到這個錯誤,這只是一個意外錯誤,解決方法很簡單,需要的朋友可以參考下2015-01-01Shell腳本實現(xiàn)的基于SVN的代碼提交量統(tǒng)計工具
這篇文章主要介紹了Shell腳本實現(xiàn)的基于SVN的代碼提交量統(tǒng)計工具,本文直接給出實現(xiàn)腳本代碼,需要的朋友可以參考下2015-06-06expect自動檢測并重啟另外一臺服務(wù)器上的程序代碼
expect自動檢測并重啟另外一臺服務(wù)器上的程序的代碼,有需要的朋友可以參考下2013-02-02數(shù)據(jù)結(jié)構(gòu) 二叉樹的遞歸與非遞歸
這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu) 二叉樹的遞歸與非遞歸的相關(guān)資料,需要的朋友可以參考下2017-05-05linux shell流程控制語句實例講解(if、for、while、case語句實例)
linux shell有一套自己的流程控制語句,其中包括條件語句(if),循環(huán)語句(for,while),選擇語句(case)。下面我將通過例子介紹下,各個語句使用方法2014-04-04Linux Shell腳本系列教程(三):變量和環(huán)境變量
這篇文章主要介紹了Linux Shell腳本系列教程(三):變量和環(huán)境變量,本文講解了普通變量、獲取字符串的長度、環(huán)境變量等內(nèi)容,需要的朋友可以參考下2015-06-06Shell腳本中的位置變量參數(shù)(特殊字符)實例講解
這篇文章主要介紹了Shell腳本中的位置變量參數(shù)(特殊字符)實例講解,本文講解了$#、$* 、$$ 、$!、$@、$-、$?等特殊字符的作用,并給出使用實例,比較清晰和簡潔,需要的朋友可以參考下2015-05-05