自動対話式スクリプトを期待

1.説明

  スクリプトを書くとき、あなたは別のホストにコピー機の中に別のホスト上のコマンド、またはファイルを実行するために必要な経験すること。あなたは2つのホスト間の相互信頼をしない場合は、自動化されたスクリプトを書くことで、パスワード、のための対話のユーザーが参加する、それが動作しません。

スクリプトで自動相互作用を達成するために、我々はする必要が期待します

2.コマンドを期待します

  期待の相互作用のための処理コマンドです。期待の相互作用は、スクリプトで記述することが可能で、あなたは完全な自動化を実現することができます。上記の問題を解決することができます。

次のように画像は、対話型のコマンドが解決することができます。

  1. SSH
  2. SCP
  3. FTP

 

CentOSの/ RHEL実装が期待します 

#yumをインストール期待-y

 

2.1で一般的に使用されるコマンドを期待します

  期待して、送信、卵、対話:最も重要な4つのコマンドを期待

  • 送信:プロセスに文字列を送信します
  • 期待:プロセスからの文字列を受け取ります
  • 産卵:新しいプロセスを開始
  • 対話:ユーザーとの対話を許可します

 

(1)コマンドを送信します

  sendコマンド文字列パラメータを受信し、このパラメータはプロセスに送信されます。

[ルート@ localhostの〜]#期待
expect1.1> "ハロー中国\ n"は送信
ハロー中国

 

(2)コマンドを期待します

A.基本

  待ち時間は通常、フィードバックを処理するために使用される期待し、コマンドを期待するとコマンドに反対を送ります。文字列パラメータを受信することも、正規表現のパラメータを受け取ることが、期待しています。そして、本明細書の結合コマンドを送信します。

 

#!は/ usr / binには、/期待
の"n \ HI"期待
送る"こんにちは!\ n"は

上記のスクリプトの意味:

"N \ HI" 期待 - >標準入力からの "n \ HI" 待って

標準出力にハロー場所> - 「!\こんにちはn」を送ります

それは簡単な擬似コードで書かれている場合は、次のように:

[ "$ cmdを" == "HI"]であれば、その後、
  「こんにちは!」エコー 
Fiの

 

シンプル期待するスクリプトを見てください:

期待/#!は/ usr / binに
"\ HI N"期待
送る"あなたが入力した<$ expect_out(バッファ)>" 
送信"が、私は唯一の期待<$ expect_out(0、文字列)>"

結果:

 

スクリプトを実行することで、あなたが決めることができます。

  $のexpect_out(バッファー)が一致することで、すべての入力を

  $のexpect_out(0、文字列)が一致する入力パラメータが期待します  

 

B.モード - アクション

(A)単一の分岐モードの構文:

期待する "HI" { "あなたがn \ハイテクと述べ、" 送信}

入力がhi、「あなたは、\ nはハイテクと述べ、」返さない場合にのみ、

 

(B)マルチドロップモードの構文:

期待する"HI" { "あなたがn \ハイテクと述べ、"送信} \ 
"こんにちは" \ { "こんにちは自分は\ n"は送信} 
{ "これは予期しない\ nをした"送信} "さようなら"

 

BYE、ハロー、Hiに一致し、対応する出力を行います。

HI - >あなたがn \ハイテク言っ
こんにちは- >あなたは言ったハイテクのn \ 
さようなら- >予期しない\ nをされたこと

 

(3)スポーンコマンド

上記のテストは手動入力を介して相互作用することがあり、産卵コマンドは、新しいプロセスを起動し、対話と産卵送信し、プロセスをオープンすることを期待するために使用されます。

#!は/ usr / binに/期待して
設定されたタイムアウト-1 
スポーンのscp [email protected]を:/ルート/テストファイル/ルート/ 
期待する"*パスワードは*" 
送信"123456 \ r"は
"100%"は期待
eofの期待

結果:

期待して産卵することにより、この規範の下で、自動相互作用を達成することができ、次の分析を送信します。

 

(4)コマンドを対話

  上記の3つのコマンドが送信、産卵を通じて、自動化の多くは、スクリプトを完了することができました、しかし、必要な場合には適切な時に、このプロセスが対話コマンドを使用する必要があり、人間の介入を必要と期待しています。

#!/usr/bin/expect
set timeout -1
spawn ssh [email protected]
expect "*password*"
send "123456\r"
expect "#*"
send "ip a | egrep global\r"
interact

 

 

3. expect 使用实例

  expect 经常是作为脚本出来的, 接下来通过我日常使用的几个实例来说明:

 

3.1 expect scp的实现

  scp 执行流程如图:

        

 

在编写实现 scp 之前,我们要考虑:

  (1)如果是第一次执行 scp 需要确认服务器公钥,如果不是第一次执行则无需这一步

  (2)timeout 时间设定,当拷贝大文件时,timeout设置的过短会造成文件没有完全的传输完成。

 

在编写脚本的时,需要考虑以上问题,脚本如下:

#!/usr/bin/expect
set timeout 3
set host "192.168.118.15"
set username "root"
set password "123456"

# 使用spawn 启动一个新进程执行 scp 命令
spawn scp $username@$host:/root/testfile /root/

# 在这里timeout 为 3秒,超过三秒执行下一个匹配
expect "*yes/no*" {send "yes\r"}
expect "*password*" {send "$password\r"}

# 在scp传输文件时,timeout时间设置为无限时,当大文件传输时,需要更多的时间
set timeout -1

# 当匹配到 传输完成 100%后,转到下一步
expect "100%"

# 使用 eof 结束该进程,因为上面设置 timeout 为 -1 无限时
expect eof

执行结果:

可以看到,文件传输需要 14 秒,而上面如果设置的超时时间低于 14 秒, 则文件传输不完整。

 

在日常使用中,expect 结合 shell 使用,在 shell 中引用 expect 脚本如下:

#!/usr/bin/bash
...
[shell 执行脚本]
...
expect <<EOF
set timeout 3
...
[expect 执行脚本]
...
EOF
...
[shell 执行脚本]
...

 

例如:拷贝一个压缩包到本地,然后解压

#!/bin/bash

host="192.168.118.15"
username="root"
password="123456"
expect <<EOF
set timeout 3
spawn scp $username@$host:/root/testfile.tar.gz /root/
expect "*yes/no*" {send "yes\r"}
expect "*password*" {send "$password\r"}
set timeout -1
expect "100%"
expect eof
EOF
echo '开始解压...'
tar xf testfile.tar.gz
if [ $? -eq 0 ]; then
  echo '解压完成.'
fi

 执行结果:

 

3.2 expect ssh执行远程命令

  ssh远程执行命令流程如下:

          

执行脚本:

#!/usr/bin/expect
set timeout 3
set host "192.168.118.15"
set username "root"
set password "123456"

spawn ssh $username@$host ifconfig
expect "*yes/no*" {send "yes\r"}
expect "*password*" {send "$password\r"}
expect eof

执行结果:

 

expect 匹配 shell 使用还是很强大的,尤其是在没有 python 和无法连接互联网的环境中。

 

おすすめ

転載: www.cnblogs.com/hukey/p/10949963.html