天天看點

shell腳本—免互動

目錄

​一、Here Document免互動​

​​1.1 Here Document概述​​

​​1.2 注意事項​​

​1.3 免互動示例​

​​1.3.1 wc -l實作對行數的統計​​

​​1.3.2 read指令接收輸入并列印​​

​​1.3.3 passwd給使用者設定密碼​​

​​1.4 免互動變量替換​​

​​1.5 總結​​

​二、Expect免互動​

​​2.1 概述​​

​2.2 基本指令​

​​2.2.1 腳本解釋器​​

​​2.2.2 spawn​​

​​2.2.3 expect​​

​​2.2.4 send​​

​​2.2.5 結束符​​

​​2.2.6 set​​

​​2.2.7 exp_continue​​

​​2.2.8 send_user​​

​​2.2.9 接收參數​​

​2.3 Expect執行方式​

​​2.3.1 直接執行​​

​​2.3.2 嵌入執行​​

​​三、執行個體​​

一、Here Document免互動

1.使用I/O重定向方式将指令清單提供給互動式程式或指令,比如ftp、cat或read指令

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

3.文法格式

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

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

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

4.開頭标記前後的空格會被省略掉

shell腳本—免互動
shell腳本—免互動
shell腳本—免互動

<col>

1.支援變量替換:在寫入檔案時會先将變量替換成實際值,再結合cat 指令完成寫入

shell腳本—免互動

2.整體指派給變量,然後通過echo指令将變量值列印出來

shell腳本—免互動

3.關閉變量替換功能,單引号關閉變量替換,就把EOF當做字元串

shell腳本—免互動

4.去除每行之前的TAB字元

shell腳本—免互動

5.多行注釋

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

2.":"代表什麼都不做的空指令。中間标記區域的内容不會被執行,會被bash忽略掉,是以可達到批量注釋的效果

shell腳本—免互動

1.标記不僅僅是EOF,但約定俗成的是EOF,必須大寫,可以是其他,

2.結尾标記一定要頂格寫,前面不能有任何字元,後面也不能有任何字元

3.開頭和結尾的免互動标記一定要一緻

二、Expect免互動

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

2.安裝expect軟體包

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

2.#!/usr/bin/expect

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

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

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

3.用于接收指令執行後的輸出,然後和期望的字元串比對

向程序發送字元串,用于模拟使用者的輸入;該指令不能自動回車換行,一般要加\r(回車)或者\n

1.expect eof

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

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

2.interact

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

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

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

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

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

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

send_user表示回顯指令,相當于echo

expect 腳本可以接受從bash指令行傳遞的參數,使用[lindex $argv n]獲得。其中n從0開始,分别表示第一個,第二個,第三個…參數

shell腳本—免互動
shell腳本—免互動

三、執行個體

1.免互動放肆實作建立磁盤分區

shell腳本—免互動
shell腳本—免互動

2.實作SSH免互動自動登入

shell腳本—免互動