1. 概要

この短いチュートリアルでは、expectコマンドを使用してtelnetセッションを自動化するさまざまな方法について説明します。

2. 例expectスクリプト

expect プログラムは、インタラクティブなプログラムを自動化する手段を提供します。 1つまたは複数のプログラムを呼び出して、標準の端末を介してそれらを操作するユーザーをエミュレートすることができます。

expect も特別な言語を提供し、制御されたプログラムとの対話をスクリプト化できるようにします。 一般に、プログラムは、入力を送信し、制御されたプログラムとの間で特定の出力を待機するという考えを中心にしています。

次に、expectを使用してtelnetセッションを自動化する方法の例について説明します。

2.1. サーバーへのログイン

telnet は、リモートホスト接続の優先プロトコルとして、より安全なsshに大幅に取って代わられました。

ただし、telnetにはいくつかの利点があります。 たとえば、低電力デバイスに適した軽量プロトコルです。 さらに、安全なネットワーク内では、より安全なプロトコルによって提供される利益はわずかである可能性があります。

以下のスクリプトでは、expectedtelnetを呼び出して、ホストに自動的にログインします。

#!/usr/bin/expect

set timeout 5

set host [lindex $argv 0]
set port [lindex $argv 1]
set login [lindex $argv 2]
set password [lindex $argv 3]

spawn telnet $host $port

expect "login: "
send "$login\r"

expect "password: "
send "$password\r"

interact

それでは、上記のスクリプトを分析してみましょう。

  • set timeout 5 :呼び出されたプログラム( telnet、この場合は)がハングしたり、待機している文字列が表示されなかったりする場合があります。 timeout 変数を設定することにより、 expectedが指定された時間(秒単位)のみ待機するようになります。
  • ホスト、ポートを設定し、 およびその他の変数:ここでは、次の形式のステートメントを使用しています。 [lindex $ argv ] コマンドライン引数として呼び出し元から提供された値を使用して変数を設定する
  • spawn telnet $ host $ port telnet を呼び出し、hostおよびport変数の値を渡します
  • expected ステートメント: expected に、特定の文字列パターンが制御対象プログラムの出力に表示されるのを待つように指示します
  • send ステートメント:値を入力するユーザーをエミュレートします
  • interact :スクリプトを呼び出したユーザーにコントロールを渡します。 これで、キーボードを使用してtelnetと対話できるようになりました。

スクリプトを呼び出す方法は次のとおりです。

$ ./automate-telnet.sh localhost 23 myusername mypassword

2.2. HTTPページのリクエスト

23以外のポートに接続する場合、 telnet は、telnetサーバーに接続していないと見なします。 その後、通常のプロトコルネゴシエーションを実行しようとはしません。 これにより、telnetを汎用TCP / IPクライアントとして使用して、任意のプロトコルを使用してサーバーと対話できるようになります。

以下の例では、expectedtelnetプロセスを呼び出して、www.example.comホストへのHTTP接続を確立します。

#!/usr/bin/expect

set timeout 5

spawn telnet www.example.com 80

expect "Connected"

send "GET /index.html HTTP/1.1\r"
send "Host: www.example.com\r\r"

expect "</html>"

まず、 expected スクリプトは、「Connected」文字列( telnet が接続を確立できることを示すサイン)を待ちます。 次に、簡単な送信得るリクエストして文字列「