大綱:
1、expect環境搭建及腳本編寫
概述
expect腳本詳解
expect環境搭建
expect腳本實現ssh遠程連接
expect腳本實現ssh遠程連接(通過shell傳遞參數)
2、正則表達式詳解及實例
詳解
普通正則
擴展正則
案例
1、expect環境搭建及腳本編寫
一、概述
我們通過Shell可以實現簡單的控制流功能,如:循環、判斷等。
但是對於需要交互的場合則必須通過人工來干預,有時候我們可能會需要實現和交互程序如ssh服務器等進行交互的功能。
expect就使用來實現這種功能的工具。
expect是一個免費的編程工具語言,用來實現自動和交互式任務進行通信,而無需人的干預。
expect的作者Don Libes在1990年 開始編寫Expect時對Expect做有如下定義:
1.Expect是一個用來實現自動交互功能的軟件套件。
2. Expect則可以根據程序的提示模擬標准輸入提供給程序需要的輸入來實現交互程序執行。
3.甚至可以實現實現簡單的BBS聊天機器人。
Expect是不斷發展的,隨着時間的流逝,其功能越來越強大,已經成為系統管理員的的一個強大助手。Expect需要Tcl編程語言的支持,要在系統上運行Expect必須首先安裝Tcl。
源碼下載鏈接
http://jaist.dl.sourceforge.net/project/tcl/Tcl/8.6.4/tcl8.6.4-src.tar.gz
http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz/download
二、expect腳本詳解
1、與編寫shell腳本一樣,第一行要告訴命令解釋器執行這個腳本的程序是誰。
#!/usr/bin/expect #expect程序的路徑
這一行告訴操作系統腳本里的代碼使用那一個主程序來執行。
2、當然,在無交互式的腳本中,也需要我們設置一個反應時間,當超過這個時間,仍沒有反應時腳本就會自動斷開連接,不會一直等待下去,基本單位:秒(s)
set timeout 30
set 設置變量
這是設置超時時間的,現在你只要記住他的計時單位是:秒 。
timeout -1 為永不超時
3、在expect腳本中,使用spawn(expect內部命令)來向執行交互式命令
spawn ssh root@192.168.171.122
如果沒有裝expect或者直接在默認的SHELL下執行是找不到spawn命令的。
它主要的功能是給ssh運行進程加個殼,用來傳遞交互指令。
4、交互命令執行完后,當然是需要expect腳本來根據輸出判斷,來確定模擬輸入的數據了!這時就用到了expect(expect內部命令),格式如下:
expect {
"yes/no" { send "yes\r";exp_continue}
"password" { send "123456\r"}
}
expect的shell命令和內部命令是一樣的,但不是一個功能,習慣就好了。
這個命令的意思是判斷上次輸出結果里是否包含某個的字符串,如果有則立即返回,否則就等待一段時間后返回,這里等待時長就是前面設置的30秒
"yes/no" 判斷上一條輸出中若含有字符串"yes/no"時,send就會模擬輸入,發送"yes" 給終端,但是需要加上結束符 \r 依次來確定,本次輸入結束。exp_continue繼續執行判斷。
5、send
這里就是執行交互動作,與手工輸入的動作等效。
提示: 命令字符串結尾別忘記加上“\r”,如果出現異常等待的狀態可以核查一下。
6、exp_continue
繼續執行接下來的交互操作
7、interact
執行完成后保持交互狀態,把控制權交給控制台,這個時候就可以手工操作了。
如果沒有這一句登錄完成后會退出,而不是留在遠程終端上。
8、$argv 參數數組
expect腳本可以接收從shell傳遞過來的參數,使用
[lindex $argv n] 獲得第n+1個參數(n從0開始,分別代表第一個($0),第二個($1),第三個($2)...參數)
$argv 0
三、環境搭建:
1、上傳下載的tcl和expect源碼包
2、安裝tcl
2.1、解壓tcl源碼包到/usr/src目錄下
tar -zxf tcl8.6.4-src.tar.gz -C /usr/src
2.2 進入源碼目錄,在源碼目錄中,有很多系統支持,見下圖(linux、windows、ios):
2.3 (linux系統)進入unix目錄,配置源碼安裝目錄/usr/local/tcl,並開啟shared
cd /usr/src/tcl8.4.20/unix
./configure --prefix=/usr/local/src --enbale-shared
echo $? #檢查上一條命令是否執行成功
2.4 編譯並安裝
make -j 4 && echo $?
make install && echo $?
2.5 拷貝接口頭文件到generic目錄下
cp /usr/src/tcl8.4.20/unix /usr/src/tcl8.4.20/generic
3、安裝expect
3.1 解壓expect5.45.tar.gz到/usr/src目錄下
tar -zxf expect5.45.tar.gz -C /usr/src
3.2 切換目錄,並配置源碼:指定安裝目錄為/usr/local/expect 指定tcl庫目錄,指定tcl頭文件目錄
./configure --prefix=/usr/local/expect --with-tcl=/usr/local/tcl/bin/lib --with-tclinclude=/usr/src/tcl8.4.20/generic
echo $?
3.3 編譯並安裝
make -j 4 && echo $?
make install && echo $?
3.4 優化程序
expect是tcl的命令,所以我們需要將expect軟連接到expect目錄下
ln -s /usr/local/tcl/bin/expect /usr/local/expect/bin/expect
為了編寫腳本時,書寫方便,我們可以將expect軟連接到/bin或/usr/bin等目錄下
ln -s /usr/local/tcl/bin/expect /usr/bin/expect
詳細見下圖:
注:為了便於截圖和后期檢查,我將配置、編譯、安裝過程信息分別保存在了.log日志文件中
3、編寫expect腳本,實現無交互式ssh遠程連接
vim ssh.exp #使用exp結尾,便於以后管理和識別
chmod +x ssh.exp #對腳本添加可執行權限,也可使用expect ssh.exp
./ssh.exp
詳情見下圖:
4、編寫腳本,通過shell傳遞的參數實現ssh遠程登錄
vim argv_ssh.exp
cat argv_ssh.exp
expect argv_ssh.exp 192.168.171.63 123456
詳情見下圖:
2、正則表達式詳解及實例
一、詳解:
Linux Shell 是以一串字符做為表達式向系統傳達意思,
元字符:具有特殊含義的字符
用來闡述字符表達式意義的字符,元字符就是描述字符的字符.
用於對字符表達式的內容.
轉換及操作的信息進行描述.
介紹:符合一定規則的表達式
作用:文本查詢和字符的操作,可以匹配文本的一個字符或字符集合.
字符串(匹配.切割.替換.獲取)
所以學習正則表達式,就是在學習一些特殊符號的使用。
好處:可以簡化對字符串的復雜操作。弊端:符號定義越多,正則越長,閱讀性越差。
應用范圍:
編程語言:Java Perl Python
shell工具:
grep 從特定文件中或標准輸入中查找含有某個字符串的行
sed 從輸入中讀取信息,經過編輯后輸出
awk 文本處理
數據庫:MySql
grep命令
使用grep與正則表達式結合搜索數據,將匹配的行打印出來
Usage: grep [OPTION]... PATTERN [FILE]...
PATTERN可以是字符串,也可以是變量,還可以是正則表達式
當你的模式包含空格時就需要使用雙引號將模式引起來,空格后面容易被誤認為是文件名
grep hello world a.txt 如果你不把hello world加上引號那么就會認為world 是一個文件;
grep支持多文件查詢
OPTIONS
-E 擴展的正則表達式 egrep(PATTERN is an extended regular expression (ERE))
-i 忽略大小寫 ignore case distinctions
-v 顯示不匹配的行 select non-matching lines
-F #fgrep(PATTERN is a set of newline-separated fixed strings)
-e --regexp=PATTERN #use PATTERN for matching
-f --file=FILE #obtain PATTERN from FILE
-l #print only names of FILEs containing matches
-L #print only names of FILEs containing no match
-q #suppress all normal output(保持沉默)
-s #suppress error messages
-w --word-regexp #force PATTERN to match only whole words
-x --line-regexp #force PATTERN to match only whole lines
-h #省略文件的名稱 suppress the file name prefix on output
-n #列出所有的匹配行,並顯示行號print line number with output lines
-c #只顯示匹配行數量print only a count of matching lines per FILE
正則表達式組成
一般字符:沒有特殊意義的字符
特殊字符:元字符meta,在正則中有特殊意義
POSIX BRE與ERE中都有的meta字符:常見元字符:
\ 轉義,打開關閉后續特殊字符的含義。如\(...\)與\{...\}
. 匹配任何單個字符(除NULL)
* 匹配其前的任意多個字符或沒有,在通配符中,*匹配任意字符
^ 匹配后面字符或字符串開頭的行,^在[]中,表示不匹配對應數值
$ 匹配前面字符或字符串結尾的行
[] 匹配中括號中包含的任意一個字符,其中可用連字符(-)指的連續字符的范圍;^符號若出現在方括號的第一個位置,則表示匹配不在列表中的任一字符,
普通正則:
\{n,m\} :區間表達式,匹配第n次出現到第m次出現的字符
\(\) 保留空間,可以將最多9個獨立的子模式存儲在單個模式中。如\(ab\).*\1 : 指匹配ab組合的兩次出現,中間可存在任意數目的字符。
\n 重復在()內的第n個子模式至此點的模式
擴展正則:
{n,m} 與BRE的\{n,m\}功能相同
+ 匹配前面正則表達式的一個或多個拓展
? 匹配前面正則表達式零個或一個擴展
| 匹配|符號前后的正則表達式
() 匹配括號括起來正則表達式群
簡單正規表達式匹配案例
china : 匹配此行中任意位置有china字符的行
^china : 匹配以china開頭的行
china$ : 匹配以china結尾的行
^china$ : 匹配僅有china五個字符的行
[Cc]hina : 匹配含有China或china的行
Ch.na : 匹配包含Ch兩字母並且其后緊跟一個任意字符之后又有na兩個字符的行
China
Chana
Ch.*na : 匹配一行中含Ch字符,並且其后跟0個或者多個字符,再繼續跟na兩字符
[1234] 匹配1,2,3,4中的一個
[1-9] 數字1-9中的一個
[A-Za-z] 所有字母
[^0-9] 一個非數字的字符
A\{2\}B 匹配AAB
A\{4,\}B 匹配A出現至少4次之后有個B的字符串
A\{2,4\}B 匹配A出現在2至4次之間,之后有個B的字符串
案例:
顯示/proc/meminfo以s開頭的行,不分大小寫
grep -i "^s" /proc/meminfo
顯示/etc/passwd中不以/bin/bash結尾的行
grep -v "/bin/bash$" /etc/passwd
查找以root開頭的行/etc/passwd 顯示行號
grep "^root" -n /etc/passwd
查找包含數字的行
grep "[0-9]" /etc/yum.repos.d/rhel7.repo
腳本 過濾網站域名
grep "^https\{0,1\}.*\..*" url.txt
grep "^https\{0,1\}.*\..*\.com" url.txt
grep "^https\{0,1\}://.*\..*\.com" url.txt
grep "^https\{0,1\}://.*\.baidu.*\.com" url.txt
grep "\(https\)\{2\}" url.txt
匹配ip地址:
ifconfig | grep "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*"
ifconfig | grep "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" | head -1 | awk {'print $2'}