expect はどこでも見られます
expect コマンドを初めて見たのは、私が初めてイベントに参加したときでした。当時、それは自動デプロイメント、MD5 比較、およびリリースのための本格的なオンライン ツールのセットで、社内の有能な人材がシェル スクリプトを使用して作成しました。スクリプトと多くの期待されるコマンド。私はexpectコマンドの使い方がまったく理解できなかったので、時間を見つけてexpectコマンドについてこの記事にまとめました。
推奨: [Linux ビデオ チュートリアル ]
まずは質問をしてください
現在、2 つの Linux ホスト A と B があります。 、ホスト A からホスト B に SSH 接続し、ホスト B でコマンドを実行する方法は? このプロセスを完全に自動化するにはどうすればよいですか?この方法を使用することもできます:
ssh admin@10.220.20.15 "ls"
ただし、この方法は扱いにくく、毎回パスワードを入力する必要があり、複雑なロジックやコマンドを実行することはできません。では、完全自動化を実現するにはどうすればよいでしょうか?これには、今日の記事で要約した期待が使用されます。
期待とは何ですか?
expect は、人間の介入なしにインタラクティブなタスクを自動化するために使用される無料のプログラミング ツールです。端的に言うと、expect は自動対話機能を実装するために使用されるソフトウェアのセットです。
実際の作業では、コマンド、スクリプト、またはプログラムを実行するとき、これらのコマンド、スクリプト、またはプログラムは実行を継続するために端末から特定の指示を入力する必要があり、これらの入力は手動で行う必要があります。 Expect を使用すると、プログラムのプロンプトに従ってプログラムに提供される標準入力をシミュレートできるため、自動化された対話型実行が実現します。これは期待通りです! ! !
##expect の基本##expect を使用する場合は、基本的に次の 4 つのコマンドを処理します。
#sendコマンドは文字列パラメータを受け取り、そのパラメータをプロセスに送信します。
expect コマンドは send コマンドの反対です。expect コマンドは通常、プロセスからのフィードバックを待つために使用されます。その後、プロセスからのフィードバックに基づいて、対応する対話型コマンドを送信します。 spawn コマンドは、新しいプロセスを開始するために使用されます。spawn 後の send コマンドと Expect コマンドは両方とも、spawn を使用して開かれたプロセスと対話します。 interact コマンドは、実際にはあまり使用されません。通常、spawn、send、expect コマンドでタスクを適切に完了できますが、特別な場合には、interact コマンドを使用する必要があります。interact コマンドは次のとおりです。主に自動化を終了し、手動操作に入るために使用されます。たとえば、spawn、send、expect コマンドを使用して ftp ログイン ホストを完了し、ファイルをダウンロードするタスクを実行しますが、ファイルのダウンロードが完了した後も ftp コマンド ラインの状態を維持できるようにしたいと考えています。後続のコマンドを手動で実行することもできますが、この場合は、interact コマンドを使用すると、このタスクを非常にうまく完了できます。実践的なコード分析
上記は予想を要約し、特によく使用されるいくつかのコマンドについて詳しく説明します。以下は、一般的に使用されるいくつかの Expect スクリプトを通じて、expect を使用して日常のタスクを完了する方法の詳細な説明です。
#!/usr/tcl/bin/expect set timeout 30 set host "101.200.241.109" set username "root" set password "123456" spawn ssh $username@$host expect "*password*" {send "$password\r"} interactこれは、expect の基本的な使用法を示す、非常に単純な Expect サンプル コードです。 #!/usr/tcl/bin/expect: スクリプトを解釈するために Expect を使用します; set timeout 30: タイムアウトを秒単位で設定します (デフォルトは 10 秒です);set host "101.200.241.109": 変数を設定; spawn ssh $username@$host: spawn は、expect 環境に入った後に実行できるexpect の内部コマンドです。expect がインストールされていない場合、または直接 デフォルトの SHELL で実行すると、spawn コマンドが見つかりません。その主な機能は、対話型の指示を提供するために ssh 実行プロセスにシェルを追加することです; expect "*password*": Expect ここでも、expect の内部コマンドです。このコマンドは、最後に実行されたかどうかを判断することを意味します。出力結果に文字列 "password" が含まれている場合は、すぐに返されます。そうでない場合は、一定の時間が経過してから返されます。ここでの待ち時間は、以前に設定した 30 秒です。send " $password\r": 対応する出力結果が一致すると、オープン ssh プロセスにパスワードが送信され、対話型アクションが実行されます。 interact: 実行完了後、対話型状態が維持され、制御はコンソールに引き継がれ、この時点で手動で操作することができます。このような文がない場合は、リモート端末に留まらず、ログイン完了後に終了します。 これは、上記の単純なスクリプトの分析です。上記の例では、expect - mode-action に非常に重要な概念が含まれています。つまり、上記の Expect "*password*" {send " $password \r"}このコードが表す意味。
モード アクション
コード Expect "*password*" {send "$password\r"} と組み合わせて、「モード アクション」について説明します。簡単に言うと、パターンが一致すると対応するアクションが実行され、パスワード文字列が一致するとパスワードが入力されます。次のようなコードも表示される場合があります:
expect { "password" { send "$password\r" exp_continue } eof { send "eof" } }
其中exp_continue表示循环式匹配,通常匹配之后都会退出语句,但如果有exp_continue则可以不断循环匹配,输入多条命令,简化写法。
传参
很多时候,我们需要传递参数到脚本中,现在通过下面这段代码来看看如何在expect中使用参数:
#!/usr/tcl/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中,\$argc表示参数个数,而参数值存放在$argv中,比如取第一个参数就是[lindex $argv 0],以此类推。
总结
能够在工作中熟练的使用Shell脚本就可以很大程度的提高工作效率,如果再搭配上expect,那么很多工作都可以自动化进行,对工作的展开如虎添翼。如果你会Python的话,你的视野将会更加开阔,那个时候你又会“嫌弃”expect了。
以上がLinux 期待の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。