Python 2.7 및 3.6의 명령 라이브러리에 대한 대안

Python 2.7 및 3.6의 명령 라이브러리에 대한 대안

내 원래 질문은 다음과 같습니다.https://stackoverflow.com/questions/50164551/starting-a-process-with-a-shell-possible-injection-Detected-security-issue

거기에서는 아무런 답변도 받지 못해서 여기에 교차 게시했습니다.

나는 단지 대안을 알고 싶다
import commands
commands.getoutput()

명령 라이브러리.
운영 체제나 하위 프로세스와 같은 것을 사용하여 이를 수행할 수 있는 방법이 있습니까?

답변1

commands더 이상 사용되지 않으며 호출로 대체되어야 합니다 subprocess. 대안은 다음 commands.getoutput()과 같습니다 subprocess.Popen().communicate().

import subprocess
import shlex


command = shlex.split('/bin/ls -l -a -h')
process = subprocess.Popen(command, stdout=subprocess.PIPE)
stdout, stderr = process.communicate()

banditsubprocess호출 셸로 사용하는 모든 항목이 여전히 안전하지 않기 때문에 심각도가 낮은 문제가 여전히 발생할 수 있지만 이는 피할 수 없습니다. 나머지 경고는 코드의 잠재적인 불안정성을 상기시키는 것으로 생각하십시오. 쉘에서 실제로 호출하는 내용에 따라 문자열 상수에 하드코딩된 명령인지, 사용자 입력인지 또는 그에 따라 직접 확인해야 합니다. 호출 코드에 대한 변수? 어쨌든 정리는 항상 권장됩니다. Python에는pipes기준 치수그런 이유로.

답변2

subprocesshoefling의 답변에 따르면 "표준" 방법은 있지만 외부 라이브러리를 사용해도 괜찮다면 좀 더 현대적인 방법을 사용할 수 있습니다.

전령더 이상 사용되지 않음고객다음과 같습니다.

In [1]: import delegator

In [2]: print delegator.run('pwd').out
/home/vince

나는 그것을 설치했다:

pip install git+https://github.com/kennethreitz/[email protected]

답변3

import subprocess

commands = subprocess

나머지 코드를 그대로 유지하면 그대로 작동합니다.

관련 정보