"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알 수 있는 한 마지막 두 매개변수로 >및 를 제공하고 있다는 것입니다./tmp/files/copy_file_2_10099

모듈의 Python Popen 함수는 subprocess쉘 리디렉션을 수행하지 않으므로 이 두 매개변수를 추가 매개변수로 전달합니다. 셸에서 실행할 때 작동하는 이유는 셸이 > /tmp/files/copy_file_2_10099인수를 명령에 전달하기 전에 인수를 해석하므로 명령이 인수를 볼 수 없기 때문입니다. 쉘은 파일 열기 및 해당 파일 설명자를 명령의 표준 출력으로 사용하는 작업을 처리합니다.

Popen에 매개변수를 추가하는 것은 가능 shell=True하지만시퀀스 대신 문자열을 전달하는 것이 좋습니다.(당신이 그랬던 것처럼 배열). 이렇게 하면 Popen은 명령을 실행하고 리디렉션을 처리하기 위해 쉘을 시작합니다.

순수 Python에서 명령의 출력을 캡처하려면 stdoutPopen 호출에 (또는) 인수를 제공하여 subprocces.Popen에 파일 개체를 사용하도록 지시할 수 있습니다.stderr

답변2

파이썬subprocess.Popen()선택적 명명된 매개변수를 허용합니다.shellTrue, 셸을 통해 명령줄을 실행 하도록 설정할 수 있습니다 .

이것이 없으면(기본값) 원시 인수로 제공된 문자열을 명령에 전달합니다. 이를 통해 명령줄을 단일 문자열로 제공해야 할 것입니다. 예를 들어 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.

관련 정보