「ncat」は、Pythonスクリプトで実行すると、リダイレクトを(追加)ポート仕様として扱います。

「ncat」は、Pythonスクリプトで実行すると、リダイレクトを(追加)ポート仕様として扱います。

Pythonスクリプトでは、次のようにファイルを受信して​​受信するサブプロセスを実行しようとしていますncat

proc = subprocess.Popen(command,stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

command変数は次のリストです。

command = ['nc', '-4', '-l', '10099', '>', '/tmp/files/copy_file_2_10099']

エラーが発生します。

Ncat: Got more than one port specification: 10000 > *path to file*

>とパス文字列をポート番号として扱うようです。どんなアイデアがありますか?

答え1

問題は、私たちがnc知っている限り、最後の2つのパラメータとしておよびを>提供していることです。/tmp/files/copy_file_2_10099

モジュールのPython Popen関数はsubprocessシェルリダイレクトを実行しないため、これら2つのパラメータを追加のパラメータとして渡します。シェルで実行するときに動作する理由は、シェルが引数をコマンド> /tmp/files/copy_file_2_10099に渡す前に引数を解釈するため、コマンドが引数を見ることができないためです。シェルは、ファイルを開き、そのファイル記述子をコマンドの標準出力として使用する操作を処理します。

Popenにパラメータを追加することは可能ですshell=Trueが、シーケンスの代わりに文字列を渡すことをお勧めします。(あなたがしたように配列)。これにより、Popenはコマンドを実行し、リダイレクトを処理するためにシェルを起動します。

純粋なPythonでコマンドの出力をキャプチャするには、stdoutPopen呼び出しに(または)引数を指定して、subprocces.Popenにファイルオブジェクトを使用するように指示できます。stderr

答え2

Pythonsubprocess.Popen()オプションの名前付きパラメーターを受け入れます。shellTrue、シェルを介してコマンドラインを実行するように設定できます。

これがない場合(デフォルト)、raw引数で指定された文字列をコマンドに渡します。これにより、コマンドラインを単一の文字列として提供する必要があります。例えばsubprocess.run():

# raw strings, no shell
>>> proc = subprocess.run(["echo", "$$"])
$$

# with the shell
>>> proc = subprocess.run("echo shell pid is $$", shell=True)
shell pid is 14897

# this passes the first as the shell command line and others as $0, $1, $2
>>> args=['echo "$# args, arg #2 is: $2"', "sh", "abc", "def"]
>>> proc = subprocess.run(args, shell=True)
2 args, arg #2 is: def

だからあなたは欲しいかもしれません

command = "nc -1 -l 10099 > /tmp/files/copy_file_2_10099"
proc = subprocess.Popen(command,stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)

または、リダイレクトを直接処理することもできます。 Pythonでファイルを開きますstdout

関連情報