2. シェルコマンド言語

2. シェルコマンド言語

私がこれを入れたとき

nc -l 12345 >nc_out

シェルスクリプトでそれを実行し、Telnetを使用して他のシェルから接続し、いくつかのテキストを入力すると終了します。CNC出力

しかし、バックグラウンドでncを起動した場合(後で同じスクリプトでtelnetを起動したい):

nc -l 12345 >nc_out &

接続はすぐに終了します。

# telnet localhost 12345
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host
#

nc_out ファイルを空白のままにします。

なぜそんなことですか? ncが接続を正常に受け入れるようにするにはどうすればよいですか?


メモ:

  • RHELとFedoraではCNCそしてnmap-ncatしかしDebianはNC-伝統接続を受け入れ、データをnc_outに保存できます。

  • 同じスクリプトでTelnetを呼び出すか、別の(SSH)セッションで呼び出すかは関係ありません。動作は同じです。

  • また、@Hauke Lagingが提案したように、straceを使用してコマンドを実行して公開しました。Pastebinのstrace出力

ベストアンサー1

ジョブ制御が無効になっている(シェルスクリプトのように)、非対話型シェルで実行されるバックグラウンドコマンドstdin/dev/null

sh -c 'nc -l 12345 1>nc_out & lsof -p $!'

~からPOSIX.1-2008:

2. シェルコマンド言語

[...]

非同期リスト

コマンドが制御演算子 ( '&' ) によって終了されると、シェルはサブシェルでコマンドを非同期的に実行する必要があります。これは、シェルが次のコマンドを実行する前にコマンドが完了するのを待つべきではないことを意味します。

バックグラウンドでコマンドを実行する形式は次のとおりです。

command1 & [command2 & ... ]

明示的なリダイレクトが実行される前に、非同期リストの標準入力は、同じ属性を持つファイルに割り当てられているかのように処理する必要があります。/dev/空。インタラクティブシェルの場合、これを行う必要はありません。すべての場合において、標準入力の明示的なリダイレクトはこのアクティビティを上書きする必要があります。

クライアントがポートを介してすでに実行されているコマンドへの接続を確立すると、バックグラウンドtelnetコマンドは標準入力でEOFを検出し、/ dev / nullから強制的に読み取られるため、シャットダウンプロセスを開始するようです。 command() の戻り値 0 はファイルの終わりを示します。localhostnc12345ncreadman 2 read

# strace output (from http://pastebin.com/YZHW31ef)
14:32:26 read(0, "", 2048)              = 0
14:32:26 shutdown(4, 1 /* send */)      = 0

telnet引き続き実行して通信できるいくつかの解決策は次のとおりですnc

sh -c 'nc -l 12345 0<&0 1>nc_out &'
sh -c 'nc -l 12345 0<&- 1>nc_out &'
sh -c 'tail -f /dev/null | nc -l 12345 1>nc_out &'
sh -c 'rm -f fifo; mkfifo fifo; exec 3<>fifo; nc -l 12345 0<fifo 1>nc_out &'

おすすめ記事