![2. シェルコマンド言語](https://linux33.com/image/39108/2.%20%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E8%A8%80%E8%AA%9E.png)
私がこれを入れたとき
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 はファイルの終わりを示します。localhost
nc
12345
nc
read
man 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 &'
答え2
nc -ld host port >> logfile &
-d 標準入力から読み取ろうとしません。
これはバックグラウンドで「nc」によって実行されます。
なぜなら、 'nc'がバックグラウンドで実行されるとstdin stdout stderrを読み込むからです。
標準入力読み出しが無効になっていないと中断されます。
例:
nc -ld 12345 > nc_out
nc 127.0.0.1 12345
#enter something
データは次の場所に保存されます。CNC出力文書。