欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2017年12月21日 11:29:59   作者:luodongseu  
我們通過Shell可以實現(xiàn)簡單的控制流功能,如:循環(huán)、判斷等。下面這篇文章主要給大家介紹了關(guān)于利用expect命令實現(xiàn)Shell自動化交互的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。

背景

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

expect是一個免費的編程工具語言,用來實現(xiàn)自動和交互式任務(wù)進(jìn)行通信,而無需人的干預(yù)。expect是不斷發(fā)展的,隨著時間的流逝,其功能越來越強大,已經(jīng)成為系統(tǒng)管理員的的一個強大助手。expect需要Tcl編程語言的支持,要在系統(tǒng)上運行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、暫時不要刪除tcl源代碼,因為expect的安裝過程還需要用。

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

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

其他設(shè)置

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

expect編寫語法

expect使用的是tcl語法

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

示例

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 [多個命令間以;間隔]
#返回值:
#  0 成功
#  1 參數(shù)個數(shù)不正確
#  2 SSH 服務(wù)器服務(wù)沒有打開
#  3 SSH 用戶密碼不正確
#  4 連接SSH服務(wù)器超時
##########################################################
proc usage {} {
 regsub ".*/" $::argv0 "" name
 send_user "Usage:\n"
 send_user " $name Use_Type SSHServerIp SSHUser SSHPassword CommandList\n"
 exit 1
} 
## 判斷參數(shù)個數(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 360
set resssh 0
#定義變量標(biāo)記ssh連接時是否輸入yes確認(rèn)
set inputYes 0
set ok_string LOGIN_SUCCESS
if {$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:提示,說明輸入的用戶密碼錯誤,直接退出。
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)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • shell腳本連接并重啟遠(yuǎn)程服務(wù)器的方法

    shell腳本連接并重啟遠(yuǎn)程服務(wù)器的方法

    這篇文章主要介紹了shell腳本連接并重啟遠(yuǎn)程服務(wù)器方法,需要的朋友可以參考下
    2017-03-03
  • linux?命令中的大于號、小于號的作用及代表的意思

    linux?命令中的大于號、小于號的作用及代表的意思

    在linux中,大家也許會經(jīng)??吹?<???、<<?、<<<?、>、>>?這幾個小于號、大于號,那么他們分別代表什么意思呢?下面小編通過本文給大家介紹下linux?命令中的大于號、小于號的作用,感興趣的朋友一起看看吧
    2023-01-01
  • shell中對xargs命令傳參進(jìn)行編輯

    shell中對xargs命令傳參進(jìn)行編輯

    本文主要介紹了shell中對xargs命令傳參進(jìn)行編輯,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01
  • Shell腳本實現(xiàn)服務(wù)器多臺免密登錄操作

    Shell腳本實現(xiàn)服務(wù)器多臺免密登錄操作

    本文介紹了auto_ssh_batch.sh腳本,用于在多臺RHEL/CentOS7主機之間快速配置SSH免密登錄,并支持遠(yuǎn)程傳輸腳本/文件及執(zhí)行命令,腳本通過pass文件提供統(tǒng)一認(rèn)證憑據(jù),nodes文件定義目標(biāo)主機列表,實現(xiàn)批量自動化操作,感興趣的朋友一起看看吧
    2025-03-03
  • Shell常見用法小記

    Shell常見用法小記

    本文簡要介紹了下shell入門的一些用法,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-04-04
  • Linux下利用Opencv打開筆記本攝像頭問題

    Linux下利用Opencv打開筆記本攝像頭問題

    這篇文章主要介紹了Linux下利用Opencv打開筆記本攝像頭問題,需要的朋友可以參考下
    2017-08-08
  • 學(xué)習(xí)linux常用命令(推薦)

    學(xué)習(xí)linux常用命令(推薦)

    本文給大家分享小編日常整理的有關(guān)linux常用命令,對大家今后的工作學(xué)習(xí)非常有幫助,對linux常用命令知識感興趣的朋友一起學(xué)習(xí)吧
    2016-11-11
  • 一鍵備份gitolite服務(wù)器的Shell腳本

    一鍵備份gitolite服務(wù)器的Shell腳本

    這篇文章主要介紹了一鍵備份gitolite服務(wù)器的Shell腳本,需要的朋友可以參考下
    2014-09-09
  • 3000字掃盲shell基礎(chǔ)知識(新手必備)

    3000字掃盲shell基礎(chǔ)知識(新手必備)

    這篇文章主要介紹了3000字掃盲shell基礎(chǔ)知識,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2020-06-06
  • 基于shell腳本中cd命令無效的解決方法

    基于shell腳本中cd命令無效的解決方法

    今天小編就為大家分享一篇基于shell腳本中cd命令無效的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06

最新評論