shell中expect免互動

2022-09-23 05:47:07 字數 1913 閱讀 6607

expect

前言觀察ssh登入的互動現象

有些程式難以避免的需要互動。你該如何解決指令碼與程式的互動問題?

名詞解釋

期待, 預期, 盼望, 預料,料想, 指望, 希望, 要求,想, 認為

一、概述

我們通過shell可以實現簡單的控制流功能,如:迴圈、判斷等。但是對於需要互動的場合則必須通過人工來干預,有時候我們可能會需要實現和互動程式如telnet伺服器等進行互動的功能。而expect就使用來實現這種功能的工具。

expect是一個免費的程式設計工具語言,用來實現自動和互動式任務進行通訊,而無需人的干預。expect的作者don libes在1990年開始編寫expect時對expect做有如下定義:expect是一個用來實現自動互動功能的軟體套件 (expect [is a] software suite for automating interactive tools)。使用它系統管理員 的可以建立指令碼用來實現對命令或程式提供輸入,而這些命令和程式是期望從終端(terminal)得到輸入,一般來說這些輸入都需要手工輸入進行的。 expect則可以根據程式的提示模擬標準輸入提供給程式需要的輸入來實現互動程式執行。甚至可以實現實現簡單的bbs聊天機器人。:)

expect是不斷髮展的,隨著時間的流逝,其功能越來越強大,已經成為系統管理員的的一個強大助手。expect需要tcl程式語言的支援,要在系統上執行expect必須首先安裝tcl。

二、expect工作原理

從最簡單的層次來說,expect的工作方式象一個通用化指令碼工具。用來實現計算機之間需要建立連線時進行特定的登入會話的自動化。

指令碼由一系列expect-send對組成:expect等待輸出中輸出特定的字元,通常是一個提示符,然後傳送特定的響應。

解決人機互動的問題

安裝

yum install -y expect tcl tclx tcl-devel

示例1:

通過expect解決ssh互動問題

1 通過expect編寫指令碼

示例

#!/usr/bin/expect

spawn ssh [email protected]

expect

"password:" ;

}interact

#!/bin/bash

#建立一個ip地址檔案。

>ip.txt

for i in do&

done

#!/bin/bash

#建立一個ip地址檔案。

>ip.txt

for i in do

"password:"

}expect eof

eof fi

}&done

wait

echo "finishi..."

#!/usr/bin/expect

set timeout 10

spawn ssh-copy-id 192.168.122.152

expect

"password:"

}

3 優化指令碼

安裝和公鑰

示例

#!/bin/bash

#建立一個ip地址檔案。

>ip.txt

#檢測expect是否安裝,檢測公鑰是否建立。

rpm -q expect &> /dev/null

if [ $? -ne 0 ] ;then

yum install -y expect

fiif [ ! -f ~/.ssh/id_rsa ];then

ssh-keygen -p "" -f ~/.ssh/id_rsa

fi

Expect中的timeout設定

expect自動化工具非常有用,不過這次在使用autossh指令碼的時候,發現了一個timeout設定的問題。 expect指令碼我們都知道,首先spawn我們要執行的命令,然後就給出一堆expect的螢幕輸出,如果輸出match了我們的expect的東西,我們就會send一個命令上去,模擬使用者輸入。 ...

shell shell中if語句的使用

bash中如何實現條件判斷? 條件測試型別 整數測試 字元測試 檔案測試 一 條件測試的表示式 expression 括號兩端必須要有空格 expression 括號兩端必須要有空格 test expression 組合測試條件 二 整數比較 命令間的邏輯關係 第一個條件為假 第二個條件不用在判斷,...

shell中 的妙用

1 截斷功能 拿掉第一條 及其左邊的字串 dir1 dir2 dir3 my file txt 拿掉最後一條 及其左邊的字串 my file...