Shell程式設計之免互動

2021-10-25 09:31:54 字數 4819 閱讀 3968

here document變數設定

here document格式控制

expect概述

expect語法

expect執行方式

使用i/o重定向的方式將命令列表提供給互動式程式

標準輸入的一種替代品

語法格式

命令<=>一般用eof

......

eof

1:標記可以使用任意合法字元

2:結尾的標記一定要頂格寫,前面不能有任何字元

3:結尾的標記後面也不能有任何字元(包括空格)

4:開頭標記前後的空格會被省略掉

[root@localhost ~]

# vim test.sh

#!/bin/bash

read i <<

eofhello

eofecho

$i[root@localhost ~]

# bash test.sh

hello

[root@localhost ~]

# vim test.sh

#!/bin/bash

useradd zhangsan

passwd zhangsan <<

eof123123 ===>passwd命令需要的密碼和確認密碼

123123

eof[root@localhost ~]

# bash test.sh

[root@localhost ~]

# vim test.sh

#!/bin/bash

doc_file=

"test.txt"

cat>

$doc_file

<<

eofthis is test

eof[root@localhost ~]

# bash test.sh

[root@localhost ~]

# cat test.sh

this is test

[root@localhost ~]

# vim test.sh

#!/bin/bash

doc_file=

"test.txt"

i="first"

cat>

$doc_file

<<

eofthis is $i test

eof[root@localhost ~]

# bash test.sh

[root@localhost ~]

# cat test.sh

this is first test

[root@localhost ~]

# vim test.sh

#!/bin/bash

doc_file=

"test.txt"

testfile=

$(

$doc_file

eof)

echo

$testfile

[root@localhost ~]

# bash test.sh

this is first test test.txt

[root@localhost ~]

# vim test.sh

#!/bin/bash

cat<<

'eof'===

>單引號關閉變數替換

this is test.

$text

eof[root@localhost ~]

# bash test.sh

this is test.

$text

[root@localhost ~]

# vim test.sh

#!/bin/bash

cat<<-'eof'===

>

'-'表示抑制行首的tab作用

this is test.

$text

eof[root@localhost ~]

# bash test.sh

this is test.

$text

here document多行注釋

[root@localhost ~]

# vim test.sh

#!/bin/bash

:<<

eofthis is test.

$text

eofecho

"hello"

[root@localhost ~]

# bash test.sh

hello

建立在tcl之上的乙個工具 ===>yum -y install expect

用於進行自動化控制和測試

解決shell指令碼中互動相關的問題

1.掛載光碟

2.製作本地yum源

3.執行安裝命令

方式一

[root@localhost ~]

# yum -y install expect

[root@localhost ~]

# rpm -qa|grep expect

方式二expect-5.45-14.el7_1.x86_64

[root@localhost ~]

# rpm -qa|grep tcl

tcl-8.5.13-8.el7.x86_64

spawn

啟動程序,並追蹤後續互動資訊

expect

send

向程序傳送字串,用於模擬使用者的輸入

該命令不能自動回車換行,一般要加\r(回車)

spawn [email protected] ===>追蹤指令—類似if條件

expect 「connecting (yes/no)?」 ===>捕捉會話—匹配字串

send yes\r ===>自動傳送指令—執行

結束符expect eof ===>執行自動話任務通常使用expect eof

​ 等待執行結束

interact

​ 執行完成後保持互動狀態,把控制權交給控制台

setset ===>日誌,資訊展示

設定超時事件,國企則繼續執行後續指令

單位是秒

timeout -1表示永不超時

預設情況下,timeout是10秒

exp_continue

exp_continue ===>不跳過繼續匹配

允許expect繼續向下執行指定

send_user

send_user

回顯命令,相當於echo

接收引數

expect指令碼可以接受從bash傳遞的引數

可以使用[lindex $ar** n]獲得

n從0開始,分別表示第乙個,第二個,第三個…引數

set 變數名(filename) [lindex $ar** 0]

單一分支語法

匹配的內容跟傳送的內容需要加上雙引號

expect 「password:」

多分支模式語法

語法一等價於語法二,與語法三略有區別

語法一expect 「aaa」

expect 「bbb」

expect 「ccc」 #send命令不具備回車換行功能,一般要加\r或\n

語法二expect

「bbb」

「ccc」 #只要匹配了aaa或bbb或ccc中的任意乙個,執行相應的send語句後退出該expecct語句

語法三expect

「bbb」

「ccc」 #exp_continue表示繼續後面的匹配,如果匹配了aaa,執行完send語句後還要繼續向下匹配bbb

}

[root@localhost ~]

# more test.sh

#!/usr/bin/expect ===>expect二進位制檔案的路徑

settimeout 60 ==

=>超時事件60秒

log file test.log ==

=>開啟日誌

log_user 1 ==

=>顯示資訊 0不顯示

sethostname

[lindex $ar** 0]===

>定義變數

set password [lindex $ar** 1]

spawn ssh root@$hostname===

>追蹤指令

expect

"*password"

}interact ==

=>轉交控制權

[root@localhost ~]

# chmod a+x test.sh

[root@localhost ~]

#./test.sh

#!/bin/bash

hostname=

$1password=

$2/usr/bin/expect<<-eof ==

=>expect開始標誌

spawn ssh root@$

expect

"*password:"

}expect

"*]#"

send "exit\r"

expect eof

eof ==

=>expect結束標誌,eof前後不能由空格

SHell程式設計之Expect免互動

1 expect是建立在tcl基礎上的乙個工具,expect是用來進行自動化控制和測試的工具。主要解決shell指令碼中不可互動的問題。對於大規模的linux運維很有幫助。2 在linux運維和開發中,我們經常需要遠端登入伺服器進行操作,登入的過程是乙個互動到的過程,可能會需要輸入yes no pa...

Shell 程式設計之Expect免互動

四 expect 執行方式 1 expect是建立在tcl基礎上的乙個工具,expect是用來進行自動化控制和測試的工具。主要解決shell指令碼中不可互動的問題。對於大規模的linux運維很有幫助。2 在linux運維和開發中,我們經常需要遠端登入伺服器進行操作,登入的過程是乙個互動到的過程,可能...

Shell 程式設計 免互動

here document使用i o重定向的方式將命令列表提供給互動式程式或命令,比如 ftp cat 或 read 命令。是標準輸入的一種替代品可以幫助指令碼開發人員不必使用臨時檔案來構建輸入資訊,而是直接就地生產出乙個 檔案 並用作 命令 的標準輸入。here document 也可以與非互動式...