내 원래 질문은 다음과 같습니다.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()
bandit
subprocess
호출 셸로 사용하는 모든 항목이 여전히 안전하지 않기 때문에 심각도가 낮은 문제가 여전히 발생할 수 있지만 이는 피할 수 없습니다. 나머지 경고는 코드의 잠재적인 불안정성을 상기시키는 것으로 생각하십시오. 쉘에서 실제로 호출하는 내용에 따라 문자열 상수에 하드코딩된 명령인지, 사용자 입력인지 또는 그에 따라 직접 확인해야 합니다. 호출 코드에 대한 변수? 어쨌든 정리는 항상 권장됩니다. Python에는pipes
기준 치수그런 이유로.
답변2
subprocess
hoefling의 답변에 따르면 "표준" 방법은 있지만 외부 라이브러리를 사용해도 괜찮다면 좀 더 현대적인 방법을 사용할 수 있습니다.
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
나머지 코드를 그대로 유지하면 그대로 작동합니다.