私は Debian 7 システムをポート 1815 で listen させnetcat
、着信トラフィックを VacuumFluorecentDisplay にリダイレクトしようとしています。iptables は開いており、xinetd の代わりに inetd を使用しています (ディストリビューションに付属)。しかし、思ったように動作しません。
/etc/servicesに次の行を追加しました
vfd 1815/tcp
vfd 1815/udp
/etc/inetd.conf に次の行を追加しました。
vfd stream tcp nowait root /bin/nc "-l 1815 > /dev/ttyS2"
答え1
これはほぼあらゆる点で間違っています。
inetd のコマンドライン パラメータは、単一の文字列として引用符で囲むのではなく、個別の単語として指定する必要があります。たとえば、(構文の変更を示すためだけのもので、そのままでは機能しません) 次のようになります。
-- vfd stream tcp nowait root /bin/nc "-l 1815 > /dev/ttyS2" ++ vfd stream tcp nowait root /bin/nc -l 1815 > /dev/ttyS2
歴史的な理由により、inetdはサービスのバイナリを必要としますそして通常は同じであるにもかかわらず、0 番目のコマンドライン引数を別々に指定する必要があります。たとえば ('nc' が 2 回指定されていることに注意してください)。
-- vfd stream tcp nowait root /bin/nc -l 1815 > /dev/ttyS2 ++ vfd stream tcp nowait root /bin/nc nc -l 1815 > /dev/ttyS2
inetd はサービスを開始するためにシェルを使用しないため、
> /dev/ttyS2
リダイレクトを解釈するものは何もありません。すべてが単にコマンドライン引数として nc に渡され、nc はそれをどう処理するかわかりません。これには大幅な変更が必要です。明示的にシェルを使用してコマンドを実行するか...
-- vfd stream tcp nowait root /bin/nc nc -l 1815 > /dev/ttyS2 ++ vfd stream tcp nowait root /bin/sh sh -c "nc -l 1815 > /dev/ttyS2"
...または、シェルのリダイレクトに依存せずにファイルを開くことができるまったく別のツールを使用することもできます。
-- vfd stream tcp nowait root /bin/nc nc -l 1815 > /dev/ttyS2 ++ vfd stream tcp nowait root /bin/socat socat -u tcp-listen:1815 file:/dev/ttyS2
最後に、2つのプログラムに同じポートを個別に聞くように指示することはできません。inetdの重要な点は、inetd のみ最初に「リスニング」ソケットを作成し、inetdベースのサービスは、作成したソケットのみを使用します。遺伝性の「親」inetd から。(「wait」モードでは「listening」ソケットを継承し、「nowait」モードでは個々のクライアント接続ソケットを継承します。)
言い換えると、
nc -l
inetd が既に実行したすべての処理を複製するように要求しているため、inetd サービスとして使用するのは意味がありません。代わりに、サービスは既存の stdin/stdout (inetd が接続ソケットにアタッチしたもの) を使用する必要があります。たとえば、これは最終的に正しく動作するはずです:
vfd stream tcp nowait root /bin/sh sh -c "cat > /dev/ttyS2"
これも動作するはずです:
vfd stream tcp nowait root /bin/socat socat -u stdio file:/dev/ttyS2