1. 程式人生 > 其它 >shell免互動

shell免互動

目錄

一、Here Document免互動

1.1、Here Document概述

1.使用I/O重定向方式將命令列表提供給互動式程式或命令,比如ftp、cat或read命令

2.標準輸入的一種替代品可以幫助指令碼開發人員不必使用臨時檔案來構建輸入資訊,而是直接就地生成出一個“檔案”並用作“命令”的標準輸入。Here Document 也可以與非互動式程式和命令一起使用

3.語法格式

命令 <<標記(EOF)
...
...
標記(EOF)

1.2、注意事項

標記可以使用任意合法字元 (通常使用EOF)

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

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

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

1.3、免互動示例

wc -l實現對行數的統計

read命令接收輸入並列印

passwd給使用者設定密碼

支援變數替換

在寫入檔案時會先將變數替換成實際值,再結合cat 命令完成寫入

多行註釋

1.Bash的預設註釋是“#”,該註釋方法只支援單行註釋:Here Document 的引入解決了多行註釋的問題

2.":"代表什麼都不做的空命令。中間標記區域的內容不會被執行,會被bash忽略掉,因此可達到批量註釋的效果

二、Expect免互動

2.1 概述

1.建立在tcl語言基礎上的一個工具,常被用於進行自動化控制和測試,解決shell指令碼中互動相關的問題

2.安裝expect軟體包

指令碼直譯器

1.expect指令碼中首先引入檔案,表明使用的是哪一個shell

2.#!/usr/bin/expect

spawn

spawn後面通常跟一個Linux執行命令,表示開啟一個會話、啟動程序,並跟蹤後續互動資訊,例如spawn passwd root

expect

1.判斷上次輸出結果中是否包含指定的字串,如果有則立即返回,否則就等待超時時間後返回

2.只能捕捉由spawn啟動的程序的輸出

3.用於接收命令執行後的輸出,然後和期望的字串匹配

send

向程序傳送字串,用於模擬使用者的輸入;該命令不能自動回車換行,一般要加\r(回車)或者\n

方式一:
expect "密碼" {send "123456\r"} #同一行send部分要有{}

方式二:
expect "密碼" 
send "abc123\r"       #換行send部分不需要有{}

方式三:
expect支援多個分支      #只要匹配了其中一個情況,執行相應的send語句後退出該expect語句
expect
{
"密碼1" {send "abc123\r"}
"密碼2" {send "123456\r"}
"密碼3" {send "123123\r"}
}

結束符

expect eof

1.表示互動結束,等待執行結束,退回到原使用者,與spawn對應。

2.比如切換到root使用者,expect指令碼預設的是等待10s,當執行完命令後,預設停留10s後,自動切回了原使用者

interact

1、執行完成後保持互動狀態,把控制權交給控制檯,會停留在目標終端而不會退回到原終端,這個時候就可以手工操作了。interact後的命令不起作用,比如interact後新增exit,並不會退出root使用者。而如果沒有interact則登入完成後會退出,而不是留在遠端終端上

2、使用interact會保持在終端而不會退回到原終端,比如切換到root使用者,會一直在root使用者狀態下;比如ssh到另一伺服器,會一直在目標伺服器終端,而不會切回的原伺服器

3、注意:expect eof與interact只能二選一

set

expect 預設的超時時間是10秒,通過set命令可以設定會話超時時間, 若不限制超時時間則應設定為-1,例如set timeout 30

exp_continue

exp_continue附加於某個expect判斷項之後,可以使該項被匹配後,還能繼續匹配該expect判斷語句內的其他項。exp_continue類似於控制語句中的continue語句。表示允許expect繼續向下執行指令

注意:使用exp_continue時,如果跟蹤像passwd這樣的輸入密碼後就結束程序的命令,expect{}外不要再加上expect eof。因為spawn程序結束後會預設向expect傳送eof,會導致後面的expect eof執行報錯

send_user

send_user表示回顯命令,相當於echo

接收引數

expect 指令碼可以接受從bash命令列傳遞的引數,使用[lindex $argv n]獲得。其中n從0開始,分別表示第一個,第二個,第三個…引數

2.2、Expect執行方式

直接執行

expect 直接執行,需要使用 expect 命令去執行指令碼
#!/usr/bin/expect
#設定超時時間
set timeout 5
#引數傳入
set username [lindex $argv 0]
set password [lindex $argv 1]
#開始追蹤命令
spawn su $username
#免互動執行,捕捉資訊並匹配
expect "密碼"
send "$password\r"
expect "*]#"
send_user "ok" 
#把控制權交給控制檯
interact

嵌入執行

#!/bin/bash
user=$1
password=$2
#非互動命令放在expect外面
useradd $user
#開始免交換執行
/usr/bin/expect <<EOF
#expect開始標誌
spawn passwd $user
#開啟一個程序跟蹤passwd命令,expect只能捕捉該程序資訊
expect "新的*"
send "${password}\r" 
expect "重新*"
send "${password}\r"
expect eof
EOF

實驗

使用免互動方式實現建立磁碟分割槽