シェルスクリプトは------期待(SSHは、サービスの自由な相互作用を実装します)

基本的な概要を期待

期待ジェネリックなので、任意のプログラムやタスクに関係なく、ユーザーレベルのコマンドとして実行することができます。実際には、同時に複数のプログラムに話すことができます期待しています。あるプログラムとユーザーとの対話を必要とするプログラムのために非常に有用期待しています。必要に応じて制御するプログラムを停止することなく、ユーザーに制御を返すことができます期待しています。同様に、ユーザが任意の時点でスクリプトに制御を返すことができます。

共通のオプション

-c:スクリプトで任意のコマンドは、コマンド接頭辞を実行する前に。コマンドは、シェルの破壊を防止するために、引用符で囲む必要があります。このオプションは複数回使用することができます。(使用expectk、-commandオプションを使用する場合)、複数のコマンドを順次セミコロンで区切り、-C実行することができます。

-d:いくつかの診断出力を可能にする、そのような期待や対話などのコマンドの内部活動などの主要なレポート。このオプションは、「exp_internal 1」は、同じ効果があります。そして、印刷版のを期待しています。例えば、straceのコマンドは文をトレースするために使用され、traceコマンドは、(Expectkを使用した場合、-diagオプションを使用します)変数の割り当てを追跡するために使用されます。

-D:インタラクティブデバッガを有効にします。整数値が続く値がゼロでない場合、は、Ctrl + Cは、ブレークポイントにヒットし、または他の適切なスクリプトデバッガのコマンドが表示され、次の工程の前にTclのExpectkを使用している場合、デバッガは、(コントロールを維持し、 )-debugオプションを使用します。

-f:タグは、あなたがしたい、そこからファイルの前にコマンドをお読みください。自身-fコマンドライン上のオプションである、あなたは-f提供していない場合は、ファイル内のコマンドを実行した後、コマンドを終了します無視され、後者のオプションを期待して、-f提供されている場合、残りの部分を無視しません。オプションを期待しています。あなたは-fを提供しない場合、スクリプトは、暗黙のうちに期待呼び出すと、通常のオプションは、位置パラメータを期待するとして、扱われます。もしそうなら、それは(Expectkを使用した場合、-fileオプションを使用)オプションを期待識別しようとします。

-b:行毎にファイルを読み込むことを余儀なくされて実行。デフォルトでは、コマンドファイルがメモリに読み込まれ、すべての(Expectkを使用する場合、使用-bufferオプション)を実行しています。ファイル名を提供するために、-fおよび-bの場合は「 - 」は、標準入力から読み込みます。

-i:対話形式でファイルからコマンドの代わりに、読み取りコマンドの入力を求め期待しています。ヒントexitコマンドまたはEOFで終了します。あなたは、コマンドファイルを使用していない場合、または

-c、デフォルトでは(Expectkを使用した場合、-interactiveオプションを使用します)-iを使用しています。

- :オプションの終わりを区切るために使用します。似たような状況が予想されると解釈されているのオプションを望んでいないパラメータを渡すために非常に便利です。 - パラメータの後ろにオプションを期待して解決しようとしていません。 - それはまた#と組み合わせて使用​​することができます!通常のパラメータとしてバック開始を期待する最初の非オプションに遭遇したすべてのオプションを解決します。

-N:禁止は自動的にファイルが存在する場合(Expectkを使用した場合、-NORCオプションを使用)、$ exp_library / expect.rcファイルを取得する期待しています。

-n:(使用Expectkは、オプションを-norc使用した場合)$ exp_library / expect.rcした後、ファイルが存在する場合、自動的に〜/ .expect.rcファイルを取得することを期待禁止しています。あなたは、環境変数DOTDIRを定義する場合は、指定した場所から.expect.rcファイルを取得します。

-v:印刷(Expectkを使用した場合、-versionオプションを使用)、バージョン番号を期待しています。

引数:オプションの引数はリストに構築さとargv変数に格納。ARGVのargc変数は、長さに初期化されます。argv0は、スクリプトの名前として定義されます。

直接期待して埋め込む
1を、SSHサービスを使用して直接相互作用のない書き込みによって達成できる見込み

#!/usr/bin/expect  
set timeout 20   //超时时间
//参数传入
set hostname [lindex $argv 0]
set password [lindex $argv 1]
//追捕命令
spawn ssh root@$hostname
//追捕到信息并执行免交互
expect {
        "(yes/no)" 
        {send "yes\r";exp_continue} 
        "*password"
        {send "$password\r"}
}
//将执行权限交给控制台输出
interact
[root@localhost ~]# chmod +x expect.sh  //给脚本添加执行权限
[root@localhost ~]# ./expect.sh 192.168.100.137 qweqwe //执行脚本并输入ssh登录用户的ip和登录密码
//执行脚本的结果
spawn ssh [email protected]
The authenticity of host '192.168.100.137 (192.168.100.137)' can't be established.
ECDSA key fingerprint is SHA256:nbnd6568zTp0Fgdo2gavS4YXLySyTvs7+JT/b7L/syU.
ECDSA key fingerprint is MD5:0d:02:8f:c9:28:e3:41:30:f7:fd:94:94:2d:ff:ff:dd.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.100.137' (ECDSA) to the list of known hosts.
[email protected]'s password: 
Last login: Fri Oct 11 17:02:57 2019 from 192.168.100.1

現在ログインしているユーザーを表示するには、「IPCONFIG」と入力します192.168.100.137のIPアドレスがある
ここに画像を挿入説明
あなたは、単語を待って入力し、「終了」コマンドは、現在のユーザを待つようにしたい場合

[root@localhost ~]# exit
登出

2、埋め込まれた期待書かれたマナーのssh-無料のインタラクティブサービスの利用

#!/bin/bash
hostname=$1
password=$2

/usr/bin/expect <<-EOF 

spawn ssh root@$hostname

expect {
        "(yes/no)"
        {send "yes\r";exp_continue}
        "*password"
        {send "$password\r"}
}
expect "*]#"
send "exit\r"
expect eof
EOF

スクリプトの実行結果

[root@localhost ~]# chmod +x expect1.sh 
[root@localhost ~]# ./expect1.sh 192.168.100.137 qweqwe

ここに画像を挿入説明

おすすめ

転載: blog.51cto.com/14307755/2442713
おすすめ