Expect是Linux操做系統下的一個用來處理交互操做,系統默認是沒有安裝expect庫,因此執行expect會提示找不到命令,須要手動安裝,其它安裝也比較簡單,能夠經過二進制源碼包編譯配置進行安裝,也能夠經過網絡藉助yum源來安裝,yum源安裝比較簡單;咱們下面藉助Expect庫來實現Linux交互式自動化運維操做,只須要執行腳本就能夠實現自動化運維操做,不須要手動輸入一些信息按肯定,咱們能夠將交互過程寫在一個腳本上,使之自動化完成。咱們能夠經過expect實現ssh自動登陸、ftp自動登陸、自動傳輸文件、自動建立和刪除用戶等都符合交互式自動化運維。下面咱們會經過一些案例來展示結果,咱們經過如下幾個命令來介紹四個基礎命令。linux
Linux在企業中應用仍是比較普遍,並且expect是一個免費的編程工具語言,用來實現自動和交互式任務進行通訊,而無需人的干預。expect是不斷的更新,隨着時間的流逝,其功能愈來愈強大,對Linux有基本的瞭解都知道這個命令,並且是Linux操做系統管理員必不可少的一個命令,經常使用的shell腳本都須要用到這個工具,能夠省去運維大量的操做時間,有利於提升工做效率,若是對Linux不太瞭解的能夠去購物平臺去搜劉遄老師的《Linux就該這麼學》這本書學習,書籍內容比較適合初學者,也有好多案例比較適合企業經常使用的一些操做,expect須要Tcl編程語言的支持,要在系統上運行expect必須首先安裝Tcl。正則表達式
咱們經過yum源來簡單的介紹下expect須要安裝哪幾個庫,若是要經過二進制tar.gz包安裝也能夠,須要去下載expect.tar.gz安裝包,這裏就不介紹了,操做以下:shell
# yum install expect.x86_64 expect-devel.x86_64 -y編程
下面詳細的解釋四個基礎命定,expect中最關鍵的四個命令是:send,expect,spawn,interact。vim
一、send:用於向進程發送字符串;服務器
二、expect:從進程接收字符串;網絡
三、spawn:啓動新的進程;運維
四、interact:容許用戶交互;ssh
1. send命令編程語言
send命令接收一個字符串的參數,而且將該參數發送到進程。
[root@zbox ~]# expect
expect1.1> send "hello world\n"
hello world
expect1.2>
2. expect命令
expect命令和send命令執行的結果正好相反,expect是用來等待一個進程的反饋消息,expect能夠接收一個字符串參數,也能夠接收正則表達式參數,通常都是與send命令結合使用才能看到明細的效果,下面咱們能夠用一個最簡單的交互式的案例來展現效果:
expect "hi\n"
send "hello there!\n"
上面兩行代碼的意思是:從標準輸入中等到hi和換行鍵後,向標準輸出輸出hello there。
Expect還有一種最經常使用的語法是來自tcl語言的模式-動做,這種語法在shell中應用極其靈活,使用也很是方便,下面咱們就各類語法用案例來講明
expect "hello" {send " hello "}
3. spawn命令
上面的全部案例都是和標準輸入輸出進行交互,可是咱們更但願他能夠和某一個進程進行交互。spawm命令就是用來啓動新的進程的。spawn後的send和expect命令都是和spawn打開的進程進行交互的。結合上面的send和expect命令咱們能夠實現一個更復雜點的shell程序。
# vim test.sh
set timeout -1 //設置永不超時;
spawn ssh -p 22 root@192.168.3.9 //開啓新的進程ID,該進程的用戶鏈接遠程ssh服務器;
expect "*Password" //進程返回Password時;
send "password\r" //向進程輸入password\r,這裏是輸入是root用戶的密碼
下面是測試腳本的結果:
這段代碼的做用是實現登陸到ssh服務器192.168.3.9的root帳號上,這段shell代碼中用到interact,下面咱們就來詳細的介紹這個命定;
4.interact
到如今爲止,咱們已經能夠結合spawn、expect、send自動化的完成不少任務了。可是,如何讓人在適當的時候干預這個過程了。好比ssh登陸到服務器上面要執行什麼操做,仍然能夠停留在ssh服務器登陸狀態,以便手動的執行後續命令。interact能夠達到這些目的。下面的案例是在自動登陸ssh服務器後,容許用戶交互操做。
#!/usr/bin/expect
spawn ssh root@192.168.3.9
expect "*password:"
send "password\r"
spawn sleep 10
interact
exit
這個案例其實和上面這個差很少,可是這個多了一個自動退出功能,設置登陸成功10s後自動退出。
Expect在shell中也是一個比較複雜的庫,若是想深刻的瞭解,本身也要多結合理論和實踐操做一塊兒進行,這樣學習起來仍是比較快的,還能夠經過shell實現簡單的控制功能,如:循環、判斷等。可是對於須要交互的場合則必須經過人工來干預,有時候咱們可能會須要實現和交互程序如ssh服務器等進行交互的功能,而expect就使用來實現這種功能的工具,但願本文章會給你們有所幫助。