
私はawkを使用しており、TCPソケットを介して公開したいと思います。
最初に試しましたが、micro inetdを使用すると失敗しました。私はキャリッジリターン/改行を処理する方法に問題があるかもしれないと考えてsocatに切り替えることにしました。
socatを介してリモートコマンドを使用することは非常に簡単です。
socat TCP4-LISTEN:9000 EXEC:/bin/cat
socat TCP4-LISTEN:9000 SYSTEM:"/bin/python -i"
これら二つの職業
しかし、単純なawkコマンド(たとえば、受信した行数を段階的に実行するために `awk '{print NR} '')を使用して同じ操作を試みるとき、同じシステム上の他のシェルでsocatと接続するときにどんな情報でも得られますお願いします。
私は多くのことを試しました(一部は構文エラーのため失敗しました。私には少しあいまいです。実際のコマンドの実行が委任されているため、strace socatを試しても正確に何が実行されているかを確認することはできませんでした。)
socat TCP4-LISTEN:9000 SYSTEM:"/usr/bin/awk '{print NR}'"
socat TCP4-LISTEN:9000 SYSTEM:'/usr/bin/awk "{print NR}"'
socat TCP4-LISTEN:9000 SYSTEM:'/usr/bin/awk "{print\ NR}"'
小さなスクリプトも作成しました。/tmp/testawk
#! /bin/sh
/usr/bin/awk '{print NR}'
(execバリエーションもあります)
#! /bin/sh
exec /usr/bin/awk '{print NR}'
どちらもローカルで動作しますが、電話するとき
socat TCP4-LISTEN:9000 EXEC:/tmp/testawk
出力を再送信しません。
私は問題がstdin / stdoutハンドルの継承および/またはcrlfの再処理である可能性があると思います。また、以下を試しました。
socat TCP4-LISTEN:9000 EXEC:/tmp/testawk,nofork
socat TCP4-LISTEN:9000,crnl EXEC:/tmp/testawk
socat TCP4-LISTEN:9000 EXEC:/tmp/testawk,crnl
socat TCP4-LISTEN:9000,crnl EXEC:/tmp/testawk,crnl
まだ文句を言う人がいることがわかりましたエマルジョンしかし、明らかにそれは何の関心を引き付けることができませんでした。
何が問題なのかご存知ですか?
答え1
awkは、ターミナルを指すときにラインバッファリングされ、それ以外の場合は完全にバッファリングされるstdoutとして印刷されています。これは、バッファが満たされた後に出力を受け取る必要があることを意味します。つまり、4KBが印刷されました。
多くの出力を送信して(例:yesプログラムを使用)、これをテストできます。変更するには、次の手順を実行する必要があります。 - awkの標準出力をバッファリング解除します(例:https://unix.stackexchange.com/a/25375/63847) - 発信者の shutdown(2) システムコールを使用します (醜い)。
より良いソリューションを歓迎
答え2
ptyをプログラムsocat
に関連付けるように指示できます。これにより、ラインバッファモードで強制的に実行され、必要な応答をすぐに取得できます。awk
awk
以下は、ポート9000でリッスンするコマンドラインです。
socat TCP4-LISTEN:9000 SYSTEM:'/tmp/awk.sh',pty,echo=0
スクリプトの内容は次のとおりです/tmp/awk.sh
。
#!/usr/bin/awk -f
#
BEGIN { print "This is the awk socket" }
{ print NR, $0 }
END { print "All done" }
実行例:
$ nc -vvv otherhost 9000
otherhost [192.168.1.15] 9000 (?) open
This is the awk socket
hello world
1 hello world
how are you
2 how are you
boo
3 boo
^C sent 28, rcvd 61