国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > Linux Shell > 正文

利用expect命令實(shí)現(xiàn)Shell自動(dòng)化交互的方法詳解

2020-07-27 18:49:36
字體:
供稿:網(wǎng)友

背景

linux腳本中有很多場景是進(jìn)行遠(yuǎn)程操作的,例如遠(yuǎn)程登錄ssh、遠(yuǎn)程復(fù)制scp、文件傳輸sftp等。這些命令中都會(huì)涉及到安全密碼的輸入,正常使用命令時(shí)是需要人工手動(dòng)輸入密碼并接受安全驗(yàn)證的。為了實(shí)現(xiàn)自動(dòng)化遠(yuǎn)程操作,我們可以借用expect的功能。

expect是一個(gè)免費(fèi)的編程工具語言,用來實(shí)現(xiàn)自動(dòng)和交互式任務(wù)進(jìn)行通信,而無需人的干預(yù)。expect是不斷發(fā)展的,隨著時(shí)間的流逝,其功能越來越強(qiáng)大,已經(jīng)成為系統(tǒng)管理員的的一個(gè)強(qiáng)大助手。expect需要Tcl編程語言的支持,要在系統(tǒng)上運(yùn)行expect必須首先安裝Tcl。

expect的安裝

expect是在Tcl基礎(chǔ)上創(chuàng)建起來的,所以在安裝expect前我們應(yīng)該先安裝Tcl。

(一)Tcl 安裝

主頁: http://www.tcl.tk

下載地址: http://www.tcl.tk/software/tcltk/downloadnow84.tml

1.下載源碼包

wget http://nchc.dl.sourceforge.net/sourceforge/tcl/tcl8.4.11-src.tar.gz 

2.解壓縮源碼包

tar xfvz tcl8.4.11-src.tar.gz 

3.安裝配置

cd tcl8.4.11/unix ./configure --prefix=/usr/tcl --enable-shared make make install 

注意:

1、安裝完畢以后,進(jìn)入tcl源代碼的根目錄,把子目錄unix下面的tclUnixPort.h copy到子目錄generic中。

2、暫時(shí)不要?jiǎng)h除tcl源代碼,因?yàn)閑xpect的安裝過程還需要用。

(二)expect 安裝 (需Tcl的庫)

主頁: http://expect.nist.gov/

1.下載源碼包

wget http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz/download 

2.解壓縮源碼包

tar xzvf expect5.45.tar.gz 

3.安裝配置

cd expect5.45 ./configure --prefix=/usr/expect --with-tcl=/usr/tcl/lib --with-tclinclude=../tcl8.4.11/generic make make install ln -s /usr/tcl/bin/expect /usr/expect/bin/expect 

expect

expect的核心是spawn、expect、send、set。

spawn 調(diào)用要執(zhí)行的命令

  • expect 等待命令提示信息的出現(xiàn),也就是捕捉用戶輸入的提示:
  • send 發(fā)送需要交互的值,替代了用戶手動(dòng)輸入內(nèi)容
  • set 設(shè)置變量值
  • interact 執(zhí)行完成后保持交互狀態(tài),把控制權(quán)交給控制臺(tái),這個(gè)時(shí)候就可以手工操作了。如果沒有這一句登錄完成后會(huì)退出,而不是留在遠(yuǎn)程終端上。
  • expect eof 這個(gè)一定要加,與spawn對(duì)應(yīng)表示捕獲終端輸出信息終止,類似于if....endif

expect腳本必須以interact或expect eof結(jié)束,執(zhí)行自動(dòng)化任務(wù)通常expect eof就夠了。

其他設(shè)置

  • 設(shè)置expect永不超時(shí) set timeout -1
  • 設(shè)置expect 300秒超時(shí),如果超過300沒有expect內(nèi)容出現(xiàn),則退出 set timeout 300

expect編寫語法

expect使用的是tcl語法

  • 一條Tcl命令由空格分割的單詞組成. 其中, 第一個(gè)單詞是命令名稱, 其余的是命令參數(shù)
    cmd arg arg arg
  • $符號(hào)代表變量的值. 在本例中, 變量名稱是foo.
    $foo
  • 方括號(hào)執(zhí)行了一個(gè)嵌套命令. 例如, 如果你想傳遞一個(gè)命令的結(jié)果作為另外一個(gè)命令的參數(shù), 那么你使用這個(gè)符號(hào)
    [cmd arg]
  • 雙引號(hào)把詞組標(biāo)記為命令的一個(gè)參數(shù). "$"符號(hào)和方括號(hào)在雙引號(hào)內(nèi)仍被解釋
    "some stuff"
  • 大括號(hào)也把詞組標(biāo)記為命令的一個(gè)參數(shù). 但是, 其他符號(hào)在大括號(hào)內(nèi)不被解釋
    {some stuff}
  • 反斜線符號(hào)是用來引用特殊符號(hào). 例如:n 代表換行. 反斜線符號(hào)也被用來關(guān)閉"$"符號(hào), 引號(hào),方括號(hào)和大括號(hào)的特殊含義

示例

login.exp專用于遠(yuǎn)程登錄,快捷使用方式: login.exp "exclude" "${remote_ip}" "${remote_user}" "${remote_passwd}" "${remote_command}"

#!/usr/bin/expect -f########################################################### 通過SSH登陸和執(zhí)行命令#參數(shù):1.Use_Type [check/execute]#  2.SSHServerIp#  3.SSHUser#  4.SSHPassword#  5.CommandList [多個(gè)命令間以;間隔]#返回值:#  0 成功#  1 參數(shù)個(gè)數(shù)不正確#  2 SSH 服務(wù)器服務(wù)沒有打開#  3 SSH 用戶密碼不正確#  4 連接SSH服務(wù)器超時(shí)##########################################################proc usage {} { regsub ".*/" $::argv0 "" name send_user "Usage:/n" send_user " $name Use_Type SSHServerIp SSHUser SSHPassword CommandList/n" exit 1} ## 判斷參數(shù)個(gè)數(shù)if {[llength $argv] != 5} { usage}#設(shè)置變量值set Use_Type [lindex $argv 0]set SSHServerIp [lindex $argv 1]set SSHUser [lindex $argv 2]set SSHPassword [lindex $argv 3]set CommandList [lindex $argv 4]#spawn ping ${SSHServerIp} -w 5#expect {# -nocase -re "100% packet loss" {#  send_error "Ping ${SSHServerIp} is unreachable, Please check the IP address./n"#  exit 1# }#}set timeout 360set resssh 0#定義變量標(biāo)記ssh連接時(shí)是否輸入yes確認(rèn)set inputYes 0set ok_string LOGIN_SUCCESSif {$Use_Type=="check"} { #激活ssh連接,如果要需要輸入yes確認(rèn),輸入yes,設(shè)置inputYes為1,否則輸入ssh密碼 spawn ssh ${SSHUser}@${SSHServerIp} "echo $ok_string"} else {    spawn ssh ${SSHUser}@${SSHServerIp} "$CommandList"}expect { -nocase -re "yes/no" {  send -- "yes/n"  set inputYes 1 } -nocase -re "assword: " {  send -- "${SSHPassword}/n"  set resssh 1 } #-nocase -re "Last login: " {  #  send -- "${CommandList}/n" #} $ok_string {} -nocase -re "Connection refused" {  send_error "SSH services at ${SSHServerIp} is not active./n"  exit 2 } timeout {  send_error "Connect to SSH server ${SSHUser}@${SSHServerIp} timeout(10s)./n"  exit 4 }}#如果輸入了yes確認(rèn),輸入ssh密碼if {$inputYes==1} { expect {  -nocase -re "assword: " {   send -- "${SSHPassword}/n"   set resssh 1  } }}#如果出現(xiàn)try again或者password:提示,說明輸入的用戶密碼錯(cuò)誤,直接退出。if {$resssh==1} { expect {  -nocase -re "try again" {   send_error "SSH user:${SSHUser} passwd error./n"   exit 3  }  -nocase -re "assword:" {   send_error "SSH user:${SSHUser} passwd error./n"   exit 3  }  eof {} }}send_error -- "$expect_out(buffer)"#-nocase -re "No such user" {#  send_error "No such user./n"#  exit 5# }#exit

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)武林網(wǎng)的支持。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 石阡县| 建阳市| 东乡族自治县| 井冈山市| 明水县| 广元市| 辽阳县| 塔河县| 扶绥县| 浦江县| 肃宁县| 天津市| 富锦市| 巴彦县| 行唐县| 临夏县| 凤庆县| 革吉县| 施秉县| 中阳县| 施甸县| 周宁县| 昌江| 溆浦县| 蕲春县| 武汉市| 沅江市| 三穗县| 柘城县| 紫阳县| 离岛区| 香河县| 清原| 勃利县| 兰州市| 桦甸市| 沁阳市| 梅州市| 措美县| 进贤县| 绥芬河市|