web-dev-qa-db-ja.com

ソケットメッセージを送信する単純なシェルスクリプト

テストの目的で、リモートIP>ポートに接続して単純なテキストのTCPIPソケットメッセージを送信するシェルスクリプトを作成する必要があります。

20
Bachalo

ncnetcat)を使用します。

サーバ:

$ 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)。

23
Kusalananda

一般に、netcatを使用したアドバイスがより良い方法です。

しかし、bashkshでは、次のようにすることもできます。

exec 3<>/dev/tcp/hostname/port
echo "request" 1>&3
response="$(cat <&3)"
13
ValeriyKr

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
  • 上記のサンプルでは、​​GET(echo GET / HTTP/1.0)ローカルのhttpサーバーに
  • 複雑なプロトコルが必要ない場合は、これで十分です。
4
Archemar

多くの場合、私は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"}
1
John Lunzer