テストの目的で、リモートIP>ポートに接続して単純なテキストのTCPIPソケットメッセージを送信するシェルスクリプトを作成する必要があります。
nc
(netcat
)を使用します。
サーバ:
$ nc -l localhost 3000
クライアント:
$ nc localhost 3000
サーバーとクライアントの両方が標準の出力/入力を読み書きします。
これは、サーバーとクライアントの両方が同じマシン上にある場合に機能します。それ以外の場合は、localhost
をサーバーの外部名に変更します。
もう少し興味深いのは、接続してd
を送信すると時刻を通知する「サーバー」であり、q
を送信すると終了します。
サーバー(bash
内):
#!/bin/bash
coproc nc -l localhost 3000
while read -r cmd; do
case $cmd in
d) date ;;
q) break ;;
*) echo 'What?'
esac
done <&"${COPROC[0]}" >&"${COPROC[1]}"
kill "$COPROC_PID"
クライアントセッション:
$ nc localhost 3000 d 2017年1月12日(木)18:04:21 CET こんにちは? 何? q
(サーバーはq
の後に終了しますが、クライアントが押すまで、サーバーがなくなったことを検出しません Enter)。
一般に、netcat
を使用したアドバイスがより良い方法です。
しかし、bash
とksh
では、次のようにすることもできます。
exec 3<>/dev/tcp/hostname/port
echo "request" 1>&3
response="$(cat <&3)"
netcat(例:nc)を試す
echo GET / HTTP/1.0 | nc 0 80
HTTP/1.1 400 Bad Request
Date: Thu, 12 Jan 2017 13:44:23 GMT
Server: Apache/2.4.18 (Ubuntu)
Content-Length: 311
Connection: close
Content-Type: text/html; charset=iso-8859-1
echo GET / HTTP/1.0
)ローカルのhttpサーバーに多くの場合、私はnetcat/socatにアクセスできませんでした。分散コンピューティング環境でbashのexec
を使用する際にも問題がありました。
その普及のため、代替ソリューションはGNU= AWKのTCP/IP機能を使用することです。これは、その「双方向パイプ」演算子に基づいた単純な構文を提供します。
以下は、ソケットを介してTCPメッセージを送信する this source からの変更例です。
BEGIN {
NetService = "/inet/tcp/0/cs.wisc.edu/finger"
print "coke" |& NetService
close(NetService)
}
アドレスの完全な構文は次のとおりです:/net-type/protocol/local-port/remote-Host/remote-port
。いつ local-port
を0に設定すると、ローカルホストがポートを自動的に選択します。これは通常、必要なポートです。 gawk
の- TCP/IPネットワーク機能 について詳しくは、提供されているリンクを参照してください。
Awkの実行ごとに1つのメッセージのみを送信する場合は、これを短縮できることに注意してください。
BEGIN {print "coke" |& "/inet/tcp/0/cs.wisc.edu/finger"}