1.説明
スクリプトを書くとき、あなたは別のホストにコピー機の中に別のホスト上のコマンド、またはファイルを実行するために必要な経験すること。あなたは2つのホスト間の相互信頼をしない場合は、自動化されたスクリプトを書くことで、パスワード、のための対話のユーザーが参加する、それが動作しません。
スクリプトで自動相互作用を達成するために、我々はする必要が期待します
2.コマンドを期待します
期待の相互作用のための処理コマンドです。期待の相互作用は、スクリプトで記述することが可能で、あなたは完全な自動化を実現することができます。上記の問題を解決することができます。
次のように画像は、対話型のコマンドが解決することができます。
- SSH
- SCP
- 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 和无法连接互联网的环境中。