> 백엔드 개발 > 파이썬 튜토리얼 > `shell=True`일 때 `subprocess.Popen`이 목록의 변수 인수와 함께 작동하지 않는 이유는 무엇입니까?

`shell=True`일 때 `subprocess.Popen`이 목록의 변수 인수와 함께 작동하지 않는 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2024-11-26 05:46:17
원래의
186명이 탐색했습니다.

Why Doesn't `subprocess.Popen` Work with Variable Arguments in Lists When `shell=True`?

subprocess.Popen에 변수 전달: 목록의 인수와 작동하지 않는 이유

subprocess.Popen을 사용하여 다른 Python을 호출하는 경우 스크립트를 사용하면 변수에 저장된 인수를 전달하는 데 문제가 발생할 수 있습니다. 이는 다음과 같은 명령을 실행하려고 할 때 발생할 수 있습니다.

p = subprocess.Popen(
    ["python mytool.py -a ", servers[server]['address'], "-x", servers[server]['port'], "-p", servers[server]['pass'], "some additional command"],
    shell=True,
    stdout=subprocess.PIPE
)
로그인 후 복사

문제:

shell=True를 사용하기 때문에 문제가 발생합니다. 이 플래그가 활성화되면 Popen()에 전달된 인수는 Unix 시스템에서 다르게 처리됩니다. 셸은 인수를 단일 명령 문자열로 해석하므로 예기치 않은 동작이 발생할 수 있습니다.

해결책:

이 문제를 해결하려면 사용을 중단하세요. 쉘=True. 대신 인수 목록을 직접 만들어 Popen()에 전달하세요. 예는 다음과 같습니다.

import sys
from subprocess import Popen, PIPE

# Populate list of arguments
args = ["mytool.py"]
for opt, optname in zip("-a -x -p".split(), "address port pass".split()):
    args.extend([opt, str(servers[server][optname])])
args.extend("some additional command".split())

# Run script
p = Popen([sys.executable or 'python'] + args, stdout=PIPE)
# ... Use p.stdout here
p.stdout.close()
p.wait()
로그인 후 복사

shell=True를 제거하고 인수 목록을 수동으로 구성하면 변수가 호출된 스크립트에 올바르게 전달되도록 할 수 있습니다.

보안 주의:

외부 입력과 관련된 명령에 shell=True를 전달하면 보안 문제가 발생할 수 있다는 점에 유의하는 것이 중요합니다. 하위 프로세스 문서에 언급된 위험. 스크립트에서 사용자 제공 입력을 처리하는 경우 잠재적인 취약점을 방지하려면 shell=True를 사용하지 않는 것이 좋습니다.

위 내용은 `shell=True`일 때 `subprocess.Popen`이 목록의 변수 인수와 함께 작동하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿