linux基礎,expect交互

2020-12-12 孟排強哥

有一些需要自動輸入密碼的場景,可以用expect

自動與交互式程序會話

腳本

#!/usr/bin/expect -f

argv:接收參數

argc:參數個數

argv0:腳本名

選項

-c "cmd":指定在執行腳本之前執行的命令,這些命令最好用雙引號括起,防止被shell分開解釋,可以反覆使用-c

-d:輸出調試信息,報告expect和interact等命令執行時的內部行為,腳本開頭寫"exp_internal 1"也可以達到同樣的效果

-D:交互式調試器

-f:指定命令文件

-i:交互式提示輸入命令

--:劃定選項尾,如腳本中寫 #! /usr/bin/expect - ,則任何命令行的選項都會被解釋為參數,被argv接收

命令

setfile 「xxx」 設置參數file的值為"xxx"

close:關閉與當前進程的連結

expect和interact都可以檢查到進程的退出,隱含執行一個close命令,如果用exec kill pid方式殺進程,則需要顯示調用一次close指令

-slave 同時關閉從屬進程

-onexec 0 保持spawn_id 開啟,1關閉當前的spawn_id

-i 指定關閉的spawn_id

debug:調試

now立即啟動調試器,0停止,1啟動

disconnect:從終端斷開與克隆進程的連接,克隆進程會在後臺作為獨立進程組繼續運行,IO被重定向到/dev/null

send_user "password?\ "

expect_user -re "(.*)\n"

for {} 1 {} {

if [fork]!=0 {sleep 3600;continue}

disconnect #克隆進程繼續運行

spawn priv_prog

expect Password:

send "$expect_out(1,string)\r"

. . .

exit

}

Exp_continue[-continue_timer]

這個命令可以使expect繼續執行而不是正常的返回.默認情況下,exp_continue會重高超時時鐘,-continue_timer選項會阻止時鐘重新計數(連續計數).

Exp_internal [-f file] value

如果是value非零的話,使接下來的命令將調試信息輸出到Expect和標準錯誤輸出.如果是0的話,輸出的信息將會被屏蔽.調試信息包括收到的每條信息和每次嘗試用當前輸出與腳本中的模式相匹配的信息.如果設置了輸出文件,那么正常的和調試的信息都會被寫到這個文件當中.(忽略上面value選項的值).任何之前打開的調試輸出文件將會被關閉.-info選項使exp_internal返回最近關於non-info參數的描述

Exp_open [args] [-I spawn_id]

它返回對應於原始spawn id的文件描述符.這樣這個文件描述符就可以被使用了,就好像這個文件是被Tcl的open指令打開的一樣.(這個spawn id將不再使用,wait指令將不能用在這個進程.).-leaveopen選項使spawn id保持打開,以便供Expect命令使用

Exp_pid [-i spawn_id]

它將返回對應於當前被跟蹤進程的ID.如果使用-i選項,將返回對應於指定的spawn id的進程ID.

Exp_send:send別名

Exp_send_error:它是Send_error

Exp_send_log:Send_log

Exp_send_tty:Send_tty

Exp_send_user:Send_user

Exp_version [[-exit] version]

它用於確保腳本程序與當前的Expect兼容。在沒有參數的情況下,返回當前Expect的版本.這個版本就會編譯到腳本中.如果你確切的知道你的腳本程序不需要最新版本的特性,可以指定一個以前的版本

expect_tty [expect_args ],輸入是一個tty

expect_user [expect_args],輸入是stdin

expect [[-opts] pat1 body1] ... [-opts] patn [bodyn]

等待被監控進程的輸出,如果匹配到指定輸出字符串、遇到文件尾、或超時時,則執行對應的body體,如果body是空的,將被忽略

-nocase 匹配時不區分大小寫

-timeout:選項使得Expect使用選項後面的數值做為超時時間,而不是timeout變量中設置的時間

expect_befor模式,在所有匹配之前隱含調用

expect_after模式,在所有匹配之後隱含調用

expect {

busy {puts busy\n ; exp_continue} # 輸出值有busy執行{}裡面的語句

failed abort # 輸出有failed,執行abort,abort是預定義的一個函數

"invalid password" abort #輸出字符串中間有空格,需要用雙引號括起來

-re "failed|invalid password" abort #使用正則表達式

-ex "failed|invalid *password" abort #精準正則,不對* ^等轉義

-i $proc2 busy {puts busy\n ; exp_continue} #匹配$proc2進程的輸出,默認是當前進程的輸出

-i $proc3 # 匹配到執行XXX

-i $proc4 # 匹配到執行XXX

any_spawn_id XXX

timeout abort #超時時觸發

full_buffer abort #輸出的值超過最大的match_max設置的值是觸發

null #輸出ascii 0時觸發

connected

}

匹配時,任何輸出都會被保存到expect_out緩衝區中,匹配到的9個字串分別被保存在expect_out(1, string) ~ expect_out(9, string),如果在模式前面使用了 -indeces 選項,則這9個字串的起始位置和結束位置保存在expect_out(X, start)和expect(X, end)中,X∈[0, 9]。expect(0,*)是匹配到的整個字符串,下面三條語句等效

expect "cd"

Set expect_out(0,string) cd

Set expect_out(buffer) abcd

-i選項還可以定義一個全局變量,裡面存儲著spawn_id列.當變量內容發生變化時,它會被重新讀取.這樣就可以在程序執行的時候改變I/O源.以這種方式提供的spawn_id被稱為」indirect spawn_id」

Fork

複製一個進程,返回新進程ID,失敗返回-1

interact [string1 body1] ... [stringn [bodyn]]

將控制權給用戶,根據用戶的輸入,觸發相應的動作

set CTRLZ \032

interact {

-reset $CTRLZ {exec kill -STOP [pid]} # 按下ctrl+z觸發

\001 {send_user "you typed a control-A\n"; # 發送一個字符串到終端

send "\001"

}

$ {send_user "The date is [exec date]."}

\003 exit

foo {send_user "bar"} # 用戶輸入foo時觸發

~~

}

send:發送字符串給當前進程

send_user:發送字符串到標準輸出

send_error:發送字符串到標準錯誤

send_log:發送字符串到日誌文件

send_tty:發送字符串到tty

sleep seconds:休眠

spawn [args] program [args]

創建一個執行program命令的進程,這個進程的三個標準IO都被重定向到expect,

spawn su - ftomcat -c "tar -xzf /tmp/ftomcat.tgz . 1>/dev/null 2>/dev/null"

expect "Password"

send "ftomcat\r"

expect eof

exit

相關焦點

  • 在Linux下靈活使用expect腳本的小竅門 - 51CTO.COM
    2,使用「-i」選項交互地執行expect腳本使用「-i」選項,可以通過來自於標準輸入的讀命令來交互地執行expect腳本。當你執行帶有「-c」選項的expect腳本的時候,這個選項是十分有用的。因為默認情況下,expect是交互地執行的。3,當執行expect腳本的時候,輸出調試信息當你用「-d」選項執行代碼的時候,你可以輸出診斷的信息。如下所示:$ cat sample.exp# !
  • linux基礎複習(5)建立linux開發環境
    onload=if(this.width>screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';} border=0>其中:- arm-linux-gcc
  • linux基礎應用(NFS文件共享)
    RPC遠程過程調用NFS伺服器端和客戶端之間的數據傳輸通過相對應網絡埠,由於NFS支持的功能比較多,不同的功能會使用不同的程序啟動,每啟動一個功能就會啟用一些埠來傳輸數據,因此NFS的功能對應的埠不固定,那麼造成NFS伺服器和NFS客戶端數據傳輸的通信障礙(NFS客戶端必須知道NFS伺服器端的數據傳輸埠才能通信進行數據交互
  • Linux——Shell腳本的應用1(基礎)
    Shell腳本的應用(基礎)簡介:隨著linux系統在企業中的應用越來越多,伺服器的自動化管理也變得越來越重要。在linux伺服器的自動化維護工作中,除了計劃任務的設置以外,shell腳本的應用也是非常重要的一部分。
  • Linux基礎命令之:實驗內容及小結
    實驗內容2.4.1在Linux下解壓常見軟體在Linux下安裝一個完整的軟體(嵌入式Linux的必備工具——交叉編譯工具),掌握Linux常見命令,學會設置環境變量,同時搭建起嵌入式Linux的交叉編譯環境(關於交叉編譯的具體概念在本書後面會詳細講解),為今後的實驗打下良好的基礎
  • Linux基礎命令帖:echo的使用
    # echo -e "\x31" //十六進位的31,換算成49,代表的ascii字符就是11[root@localhost ~]#原文來自:http://blog.chinaunix.net/uid-29270124-id-5828032.html本文地址:https://www.linuxprobe.com
  • Linux下C編程基礎之:本章小結與思考與練習
    3.8 本章小結本章是Linux中進行C語言編程的基礎,首先講解了C語言編程的關鍵點,這裡關鍵要了解編輯器、編譯連結器、調試器及項目管理工具等概念。
  • 玩轉Linux - shell 編程基礎(一)
    簡述使用 linux 就離不開 shell,那麼也就是說也離不開 shell 編程。
  • 使用Expect和命名管狀遠程控制SQL*Plus
    第一步是創建一樣能與SQL*Plus交互環境進行交互的東西。雖然SQL*Plus是可交互的,但是它僅限於STDOUT和STDIN,所以它可以放入一個管道中:    sqlplus /nolog < commands.sql > output.log     然而,如果我們想一次發出一條SQL*Plus命令,那麼就需要檢查SQL*Plus命令提示符「SQL>」來判斷SQL*Plus是否在等待輸入,然後使用非阻塞管道
  • 在Linux系統中安裝使用WPS的方法
    其使用免費增值模式,其中基礎版本是免費使用。比較其他的linux辦公套件,如 LibreOffice、 OpenOffice,其最大優勢在於,Kingsoft Office能最好的兼容微軟的Office(譯註:版權問題?了解下wps和Office的歷史問題,可以得到一些結論)。因此如果你需要在 windows和linux平臺間交互,Kingsoft office是一個很好的選擇。
  • Linux常用命令 awk 入門基礎教程
    在Linux/UNIX系統中,awk是一個功能強大的編輯工具,逐行讀取輸入文本,並根據指定的匹配模式進行查找,對符合條件的內容進行格式化輸出或者過濾處理,可以在無交互的情況下實現相當複雜的文本操作
  • 你與優秀程式設計師的差別,Expect實現遠程自動登錄
    Expect中最關鍵的四個命令是send,expect,spawn,interact:send:用於向進程發送字符串expect:從進程接收字符串spawn:啟動新的進程interact:允許用戶交互
  • 【乾貨】網絡虛擬化—— linux虛擬網絡基礎
    在linux裡面devic(設備)與傳統網絡概念裡的物理設備(如交換機、路由器)不同,Linux所說的設備,其背後指的是一個類似於數據結構、內核模塊或設備驅動這樣的含義。就是說device可能只是軟體系統裡的一個驅動,一個函數接口。Tap位於二層數據鏈路層,tun位於三層網絡層,兩者在linux裡的函數結構幾乎一致,除了一個flag值區分tap/tun。
  • 【Linux】常用命令之 awk 常用實例
    awk命令工具在Linux/UNIX系統中,awk是一個功能強大的編輯工具,逐行讀取輸入文本,並根據指定的匹配模式進行查找,對符合條件的內容進行格式化輸出或者過濾處理,可以在無交互的情況下實現相當複雜的文本操作
  • 《Linux就該這麼學》與《鳥哥的linux私房菜》哪個更適合初學者?
    時不時在一起聚會中也會說到一些關於linux的話題,談及關於linux「升級」話題時,一致的表示linux是一個「先苦後甜」系統。學習使用的時候非常難,但是一旦學習成功,那就是步入一馬平川之境界。針對於小白如何變成linux「最強王者」,根據朋友們的說法,總結給大夥一下建議:建議一:萬丈高樓平地起祖國古語「萬丈高樓平地起」,強調的就是基礎,一切偉大的工程起源必須有堅固無比 的地基。T:那麼對於linux來說什麼是基礎呢?S:命令?T:對!就是Linux命令!
  • expect單詞解析及用法
    如:I expect that I will be back on Sunday. 我預計星期日回來。有時可用於不好的方面。如:He expects to fail the exam. 他預料無法通過考試。另外,注意expect a baby這一慣用表達,其意為「懷孕」。
  • 英語expect 的幾點用法
    英語 expect 是常用的單詞,在各類考試中更是頻繁出現,今天我們一起學習一下這個詞的用法。1. expect + 名詞/代詞: 意思是「期待某人或某物」。例句2:Both leaders seemed to expect measurable progress.兩位領導好像都期待著顯著的進展。2. expect + (somebody)to do something: 期待(某人)做某事。
  • Linux系統從入門到放棄?
    通常在linux的基礎命令學習中包涵以下所羅列出的Linux命令:1.pwd/cd /ls/touch/mkdir/cp/rm/mv/find/du 目錄及文件操作命令2.Cat/more/less/head/tail/wc/grep/echo 文件查看操作命令3.Ln 連接命令4.Gzip/bzip/tar 文件壓縮解壓命令基礎的
  • 辨析易混詞:expect、wait、hope
    「expect」、「wait」 和 「hope」 都可以用來談論將來要發生的事情,但它們的意思不同。Today, I'm going to tell you the difference between expect, wait and hope.
  • 辨析詞義:Expect、Wait、Hope
    動詞 「expect」 表示 「某事可能會發生」;動詞 「wait」 表示 「花時間等待某事發生」;動詞 「hope」 表示 「盼望某事會發生」。看視頻,學習這三個易混詞語的用法。Hi! I'm Phil from BBC Learning English.