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

Linux學(xué)習(xí)之expect操作詳解

 更新時(shí)間:2022年10月13日 08:47:03   作者:Mrwhite86  
expect是一種腳本語(yǔ)言,它能夠代替人工實(shí)現(xiàn)與終端的交互,主要應(yīng)用于執(zhí)行命令和程序時(shí),系統(tǒng)以交互形式要求輸入指定字符串,實(shí)現(xiàn)交互通信。本文將通過示例詳細(xì)說說它的使用,感興趣的可以了解一下

一、expect安裝介紹

1.expect命令安裝

安裝語(yǔ)句:yum install expect

2.expect命令含義

expect是一種腳本語(yǔ)言,它能夠代替人工實(shí)現(xiàn)與終端的交互,主要應(yīng)用于執(zhí)行命令和程序時(shí),系統(tǒng)以交互形式要求輸入指定字符串,實(shí)現(xiàn)交互通信。

3.expect使用場(chǎng)景

(1)并根據(jù)預(yù)定標(biāo)準(zhǔn)回答其問題,回答“是”、“否”或?qū)⒖刂茩?quán)交還給您

(2)遠(yuǎn)程連接設(shè)備并執(zhí)行自動(dòng)化操作

(3)主要是一些需要人機(jī)交互的地方,如果提前知道應(yīng)該輸入什么指令都可以使用expect 工具

二、expect使用原理

1.原理介紹:

spawn啟動(dòng)指定進(jìn)程—expect獲取指定關(guān)鍵字—send向指定程序發(fā)送指定字符—執(zhí)行完成退出

2、spawn命令介紹:

spawm命令就是用來(lái)啟動(dòng)新的進(jìn)程的。spawn后的send和expect命令都是和spawn打開的進(jìn)程進(jìn)行交互的、

3、send命令介紹:

send命令接收一個(gè)字符串參數(shù),并將該參數(shù)發(fā)送到進(jìn)程,這個(gè)過程類似模擬人類輸入密碼

4、interact命令介紹:

結(jié)合spawn、expect、send自動(dòng)化的完成很多任務(wù),interact命令可以在適當(dāng)?shù)臅r(shí)候進(jìn)行任務(wù)的干預(yù),比如下載完ftp文件時(shí),仍然可以停留在ftp命令行狀態(tài),以便手動(dòng)的執(zhí)行后續(xù)命令

三、expect使用語(yǔ)法

1. expect 啟用選項(xiàng):

  • -c 執(zhí)行腳本前先執(zhí)行的命令,可多次使用
  • -d debug模式,可以在運(yùn)行時(shí)輸出一些診斷信息,與在腳本開始處使用exp_internal 1相似。
  • -D 啟用交換調(diào)式器,可設(shè)一整數(shù)參數(shù)。
  • -f 從文件讀取命令,僅用于使用#!時(shí)。如果文件名為"-",則從stdin讀取(使用"./-"從文件名為-的文件讀取)。
  • -i 交互式輸入命令,使用"exit"或"EOF"退出輸入狀態(tài)
  • -- 標(biāo)示選項(xiàng)結(jié)束(如果你需要傳遞與expect選項(xiàng)相似的參數(shù)給腳本時(shí)),可放到#!行:#!/usr/bin/expect --
  • -v 顯示expect版本信息

2.expect命令參數(shù):

  • spawn 交互程序開始,執(zhí)行后面的命令或程序。需要進(jìn)入到expect環(huán)境才可以執(zhí)行,不能直接在shell環(huán)境下直接執(zhí)行
  • set timeout n 設(shè)置超時(shí)時(shí)間,表示該腳本代碼需在n秒鐘內(nèi)完成,如果超過,則退出。用來(lái)防止ssh遠(yuǎn)程主機(jī)網(wǎng)絡(luò)不可達(dá)時(shí)卡住及在遠(yuǎn)程主機(jī)執(zhí)行命令宕住。如果設(shè)置為-1表示不會(huì)超時(shí)
  • set 定義變量
  • $argv expect腳本可以接受bash的外部傳參,可以使用[ lindex $argv n ]n為0表示第一個(gè)傳參,為1表示第二個(gè)傳參,以此類推
  • expect 從交互程序進(jìn)程中指定接收信息, 如果匹配成功, 就執(zhí)行send的指令交互;否則等待timeout秒后自動(dòng)退出expect語(yǔ)句
  • send 如果匹配到expect接受到的信息,就將send中的指令交互傳遞,執(zhí)行交互動(dòng)作。結(jié)尾處加上\r表示如果出現(xiàn)異常等待的狀態(tài)可以進(jìn)行核查
  • exp_continue 表示循環(huán)式匹配,通常匹配之后都會(huì)退出語(yǔ)句,但如果有exp_continue則可以不斷循環(huán)匹配,輸入多條命令,簡(jiǎn)化寫法。
  • exit 退出expect腳本
  • expect eof spawn進(jìn)程結(jié)束后會(huì)向expect發(fā)送eof,接收到eof代表該進(jìn)程結(jié)束
  • interact 執(zhí)行完代碼后保持交互狀態(tài),將控制權(quán)交給用戶。沒有該命令執(zhí)行完后自動(dòng)退出而不是留在遠(yuǎn)程終端上
  • puts 輸出變量

四、expect使用舉例

1.expect腳本實(shí)現(xiàn)ssh自動(dòng)登錄遠(yuǎn)程服務(wù)器

#!/usr/bin/expect

spawn ssh mrswhite@192.168.37.9
expect "*password:"
send "test20221007\r"
expect "*#"
interact

expect expect_demo1.sh 執(zhí)行查看運(yùn)行結(jié)果:

2.expect腳本實(shí)現(xiàn)ssh自動(dòng)登錄遠(yuǎn)程服務(wù)器(通用腳本,手動(dòng)輸入?yún)?shù))

#!/usr/bin/expect

if {$argc < 3} {
    puts "Usage:cmd <host> <username> <password>"
    exit 1
}

set timeout -1
set host [ lindex $argv 0 ]
set username [ lindex $argv 1 ]
set password [ lindex $argv 2 ]


spawn ssh  $username@$host
expect "*password*" {send "$password\r"}
interact

./expect_demo2.sh 192.168.37.9 mrswhite  test20221007  執(zhí)行查看運(yùn)行結(jié)果:

3.在shell 中嵌套expect

通過expect嵌套shell使用語(yǔ)句在shell內(nèi)直接執(zhí)行,任何這樣可以實(shí)現(xiàn)更多的功能

#!/bin/bash
user="mrswhite"
host="192.168.37.9"
password="test20221007"
/usr/bin/expect << EOF
set time 20
spawn ssh $user@$host
expect {
"*yes/no" { send "yes\r"; exp_continue }
"*password:" { send "$password\r" }
}
expect "*#"
send "pwd\r"
expect "*#"
send "df -h\r"
expect "*#"
send "exit\r"
interact
expect eof
EOF

五、expect相關(guān)錯(cuò)誤處理

1.invalid command name "/usr/bin/expect"

解決方案:此時(shí)是使用bash腳本嵌套了expect代碼,所以執(zhí)行采用以下兩種方式都可以

./expect_demo3.sh
sh expect_demo3.sh

2.invalid command name ":" 轉(zhuǎn)義問題

 解決方案:send里面的內(nèi)容中的括號(hào)[]有問題,不能使用[],將其去除或者添加轉(zhuǎn)義字符

send "cat 20221007.txt | awk -F : '{print $2}'"
send "cat 20221007.txt | awk -F \[:\] '{print $2}'\r"

以上就是Linux學(xué)習(xí)之expect操作詳解的詳細(xì)內(nèi)容,更多關(guān)于Linux expect的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • shell腳本根據(jù)進(jìn)程查找指定容器的方法

    shell腳本根據(jù)進(jìn)程查找指定容器的方法

    這篇文章主要介紹了shell腳本根據(jù)進(jìn)程查找指定容器的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-02-02
  • Linux修改主機(jī)名的命令詳解

    Linux修改主機(jī)名的命令詳解

    通常在購(gòu)買的服務(wù)器或者一些新安裝的Linux系統(tǒng)主機(jī)名是一個(gè)隨機(jī)的字符串,但是如果說我們想標(biāo)識(shí)一下每臺(tái)主機(jī)的名稱,我們就可以修改一下主機(jī)名,所以本文給大家介紹了Linux修改主機(jī)名的命令,需要的朋友可以參考下
    2024-01-01
  • Linux基礎(chǔ)命令日常積累

    Linux基礎(chǔ)命令日常積累

    Linux命令雖然用處很多,用過這么多次但是對(duì)其步驟、命令還是不記得,每次還是要到處找資料,下面小編把本次linux生產(chǎn)環(huán)境搭建分享在腳本之家平臺(tái),供大家參考
    2015-10-10
  • Shell中的${}、##和%%使用范例

    Shell中的${}、##和%%使用范例

    這篇文章主要介紹了Shell中的${}、##和%%使用范例,本文給出了不同情況下得到的結(jié)果,需要的朋友可以參考下
    2015-04-04
  • 利用xargs批量刪除Docker鏡像的方法

    利用xargs批量刪除Docker鏡像的方法

    在Linux系統(tǒng)中,xargs命令是一個(gè)非常強(qiáng)大的工具,可以幫助將標(biāo)準(zhǔn)輸入轉(zhuǎn)換為命令行參數(shù),并傳遞給其他命令,本文將重點(diǎn)介紹xargs參數(shù)的使用,以及如何利用xargs結(jié)合其他命令刪除特定的Docker鏡像,需要的朋友可以參考下
    2024-04-04
  • linux shell 路徑截取正則表達(dá)式

    linux shell 路徑截取正則表達(dá)式

    這篇文章主要介紹了linux shell 路徑截取正則表達(dá)式的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • 防止shell腳本重復(fù)執(zhí)行的代碼

    防止shell腳本重復(fù)執(zhí)行的代碼

    利用鎖機(jī)制,讓一個(gè)特定的shell腳本,每次只能運(yùn)行一個(gè)實(shí)例。具體來(lái)說,獲得鎖的腳本實(shí)例,能夠繼續(xù)往下執(zhí)行臨界區(qū)代碼;沒有獲得鎖的實(shí)例,則只能等待
    2013-01-01
  • Shell腳本對(duì)比兩個(gè)文本文件找出不同行的2個(gè)方法分享

    Shell腳本對(duì)比兩個(gè)文本文件找出不同行的2個(gè)方法分享

    這篇文章主要介紹了Shell腳本對(duì)比兩個(gè)文本文件找出不同行的2個(gè)方法分享,本文分別使用comm命令法、grep命令法實(shí)現(xiàn),需要的朋友可以參考下
    2014-12-12
  • Linux命令提示符顯示格式的配置方法

    Linux命令提示符顯示格式的配置方法

    今天小編就為大家分享一篇Linux命令提示符顯示格式的配置方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2018-06-06
  • 每天一個(gè)linux命令 chgrp命令

    每天一個(gè)linux命令 chgrp命令

    這篇文章主要為大家詳細(xì)介紹了一個(gè)linux命令:chgrp命令,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02

最新評(píng)論