質問: 同じCentOS7の複数のターミナルからTelnetを同時にいくつも行うシェルを作りたいです。 下記のシェルだとtelnetを行った後にエンターを入れられないからか、次に進めません。 また、複数のターミナルからシェルを実行させる為にはどうすれば良いのかが分かりません。 ``` #!/bin/bash count=0 while [ $count != 20 ] do telnet x.x.x.x 80 GET /index.html HTTP/1.1 HOST:x.x.x.x connection:Keep-Alive count=$(($count + 1)) done ``` 宜しくお願いします。 コメント回答です。 sshでは無くtelnetを使うのはサーバとの接続確認(keepaliveの設定確認を行う為です。) 今回は検証に利用するので、勿論セキュリティ上telnetでは無くsshを使うのは承知しています。 telnet接続後、HTTP1.1でGETコマンドでデータを送信します。 はい、1つのシェルスクリプトで同時に並列作業的に複数のtelnet⇒getコマンドを送りたいと思っています。
回答: ログイン時のインタラクティブなやり取りは、古くはtclのexpect拡張というものがあって、 現在は、同等の機能が実現出来るperlやpythonなどの実装もあります。 (「expect」で検索してみてください) シェルスクリプトだとemptyというツールで実現出来ます。 しかし、今回の場合はexpectを使わなくても良さそうな気がします。 HTTPのやり取りをするのであればtelnetよりも、nc(netcat)などのほうがやりやすそうな気がします。 ncを使えば、コマンドラインでHTTP/1.1リクエストを送り結果を標準出力へ出力させることが可能です。 (HTTPプロトコルあまり詳しくないのでリクエストの仕方が間違えてたらすみません) `$ echo -e "GET /index.html HTTP/1.1\nhost: localhost\n" | nc localhost 10080` 複数のリモートマシンに順番にやるのであれば上記コマンドをマシン数分だけ繰り返し実行すれば良いと思います。 並列化するには1マシン分のHTTPリクエスト処理を独立したシェルスクリプトにして、それを親シェルスクリプトからバックグラウンドで実行するという感じでやるのはどうでしょうか? ※追記 よく考えたらHTTPならば単純にcurlやwgetで取得したほうが良いのかもしれません。