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

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

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

答え1

使用ncnetcat)。

仕える人:

$ nc -l localhost 3000

顧客:

$ nc localhost 3000

サーバーとクライアントの両方が標準出力/入力を読み書きします。

これは、サーバーとクライアントが同じマシン上にあるときに機能します。それ以外の場合は、localhostサーバーの外部名に変更します。サーバーでは、0.0.0.0使用可能なすべてのインターフェースにサーバーをバインドするためにそれを使用(または完全に削除)することもできます。

もっと興味深いのは、「サーバー」に接続して過ごすと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"

クライアントセッション:

$cnclocalhost3000
D
2017年1月12日木曜日18:04:21 CET
こんにちは?
何?
キュー

(サーバーはを押した後に終了しますが、qクライアントはを押すまでサーバーが消えたことを検出しませんEnter)。

答え2

一般的に言えば、アドバイスはnetcatより良いアプローチです。

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

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

答え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サーバーにGET()を送信します。
  • 複雑なプロトコルが必要ない場合は、作業を完了できます。

答え4

netcat/socatにアクセスできない状況がたくさんあります。execまた、分散コンピューティング環境でbashを使用する際に問題がありました。

普遍性のため、代替ソリューションはGNU AWKのTCP / IP機能を使用することです。 「双方向パイプ」演算子に基づく単純な構文を提供します。

以下は修正例です。このソースこれにより、ソケットを介してTCPメッセージが送信されます。

BEGIN {
 NetService = "/inet/tcp/0/cs.wisc.edu/finger"
 print "coke" |& NetService
 close(NetService)
}

アドレスの完全な構文は次のとおりです/net-type/protocol/local-port/remote-host/remote-port。 0に設定すると、local-portローカルホストは通常​​必要なポートを自動的に選択します。gawk以下についてもっと読むことができます。TCP/IPネットワーク機能提供されたリンクから。

awk 実行ごとに 1 つのメッセージだけを送信する場合、この時間が短縮されることがあることは注目に値します。

BEGIN {print "coke" |& "/inet/tcp/0/cs.wisc.edu/finger"}

関連情報