MinecraftサーバーからJSONステータス応答をコピーするスクリプトを生成しようとしています(https://wiki.vg/Server_List_Ping)。現在xinetd
エコープリセットを実行するように設定されているシェルスクリプトがありますが、TCPパケットの作成に問題があります。何らかの理由でecho
フラグを無視し、次のすべてを返します。問題を再現した簡単な例は次のとおりです。
/usr/bin/mc
#!/bin/sh
# hello!
echo -en "\x68\x65\x6c\x6c\x6f\x21"
/etc/xinetd.d/minecraft
service minecraft
{
type = UNLISTED
instances = 20
socket_type = stream
protocol = tcp
wait = no
user = root
group = root
server = /usr/bin/mc
port = 25565
disable = no
}
要求クライアントに表示されるTCP応答データ:
00000000: 2d65 6e20 5c78 3638 5c78 3635 5c78 3663 -en \x68\x65\x6c
00000010: 5c78 3663 5c78 3666 5c78 3231 0a \x6c\x6f\x21.
クライアント要求を最初に読む必要がありますか、それともecho
呼び出された場合は別名を別のものとして読み取る必要がありますかxinetd
?
答え1
echo
内部シェルコマンドです。最初の行を次のように変更すると:
#!/bin/bash
このプログラムは理解しているecho
ので動作します。bash
-en
/bin/sh
それ以外の場合は、システムに実際に存在するシェルを確認し、そのecho
コマンドに正しい構文を使用する必要があります。