현재 침투 테스트 및 Python 프로그래밍을 연구 중입니다. Python에서 Linux 명령을 실행하는 방법을 알고 싶습니다. 실행하려는 명령은 다음과 같습니다.
echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080
Python에서 터미널에서 실행하면 직접 입력하고 Enter 를 누르는 것처럼 실행하는 것과 동일하게 수행됩니까?
댓글
답변
다음과 같이 os.system()
를 사용할 수 있습니다.
import os os.system("ls")
또는 귀하의 경우 :
os.system("echo 1 > /proc/sys/net/ipv4/ip_forward") os.system("iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080")
더 좋게도 하위 프로세스의 호출을 사용할 수 있습니다. 더 안전하고 강력하며 더 빠를 가능성이 높습니다.
from subprocess import call call("echo "I like potatos"", shell=True)
또는 셸을 호출하지 않고 :
call(["echo", "I like potatos"])
출력을 캡처하려는 경우이를 수행하는 한 가지 방법은 다음과 같습니다.
import subprocess cmd = ["echo", "I like potatos"] proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) o, e = proc.communicate() print("Output: " + o.decode("ascii")) print("Error: " + e.decode("ascii")) print("code: " + str(proc.returncode))
매우 communicate
의 timeout
및 호출시 발생할 수있는 예외를 캡처합니다. 이것은 오류가 발생하기 쉬운 코드이므로 오류가 발생할 것으로 예상하고 그에 따라 처리해야합니다.
https://docs.python.org/3/library/subprocess.html
댓글
- os.system은 버전 2.6부터 더 이상 사용되지 않습니다. Subprocess는 사용하기에 적합한 모듈입니다.
- @binarysubstrate, 지원되지 않거나 사용할 수없는 것처럼 더 이상 사용되지 않습니까? 저는 ' 최근에 2.7 (선택이 아님)이 설치된 컴퓨터에서 작업했으며
os.system
는 여전히 작동합니다. - 또한 권장되는대로
subprocess.call
를 사용하는 경우shell=True
를 지정해야 할 수 있습니다 … here - Python 3.4에서는 shell = True를 지정해야합니다. 그렇지 않으면 call 명령이 작동하지 않습니다. 기본적으로 call은 shell = True가 설정되지 않은 경우 문자열로 지정된 파일을 열려고 시도합니다. 또한 Python 3.5에서 호출이 run으로 대체 된 것처럼 보입니다.
- 일반 POSIX 코드는
LC_CTYPE
<의 문자 집합으로decode()
를 호출해야합니다. / div> 환경 변수.
Answer
첫 번째 명령은 단순히 파일에 기록합니다. python
는 쉘의 도움없이 파일을 읽고 쓸 수 있기 때문에 쉘 명령으로 실행하지 않습니다.
with open("/proc/sys/net/ipv4/ip_forward", "w") as f: f.write("1")
iptables
명령은 외부에서 실행할 수 있습니다.이를 수행하는 가장 좋은 방법은 를 사용하는 것입니다. 하위 프로세스 모듈 .
import subprocess subprocess.check_call(["iptables", "-t", "nat", "-A", "PREROUTING", "-p", "tcp", "--destination-port", "80", "-j", "REDIRECT", "--to-port", "8080"])
또한이 메서드는 불필요한 오버 헤드가 발생하는 셸을 사용하지 않습니다.
답변
가장 빠른 방법 :
import os os.system("your command here")
가장 유연한 접근 방식은 아닙니다. ; 프로세스를 “한 번 실행하여 완료하고 종료 할 때까지 차단”하는 것보다 더 많은 제어가 필요한 경우 대신 subprocess
모듈을 사용해야합니다.
답변
일반적으로 가능한 한 파이썬 바인딩을 사용하는 것이 좋습니다 (다른 장점 중에서 예외 포착이 더 좋습니다).
echo
명령의 경우 @jordanm “의 답변에서 제안한대로 Python을 사용하여 파일에 쓰는 것이 분명히 좋습니다.
iptables
명령, python-iptables
( PyPi 페이지 , 설명 및 문서가있는 GitHub 페이지 )에서 필요한 정보를 제공합니다 (특정 명령을 확인하지 않음).
이렇게하면 따라서 이점에 가중치를 두어야합니다. 하위 프로세스를 사용하는 것은 작동하지만 출력을 사용하려면 “직접 구문 분석하고 향후 iptables
버전에서 출력 변경 사항을 처리해야합니다.
설명
- 또 다른 점은
subprocess
호출을 사용하는 단위 테스트 코드가 덜 유용하다는 것입니다. 예, 하지만 테스트는 외부 호출의 결과에 대한 가정을해야합니다. - 당신의 대답은 조언과 비슷합니다. OP는 그가 파이썬에서 리눅스 시스템 명령을 어떻게 실행할 수 있는지 구체적으로 물었습니다.
- @kapad 예.하지만 그는 왜 그렇게 하려는지 명시했고 대안을 제안했습니다.
답변
셸의 Python 버전입니다. 테스트하지 않았습니다.주의하세요.
from subprocess import run def bash(command): run(command.split()) >>> bash("find / -name null") /dev/null /sys/fs/selinux/null /sys/devices/virtual/mem/null /sys/class/mem/null /usr/lib/kbd/consoletrans/null
설명
- 문자열 분할은 단순한 경우에만 작동합니다. 셸 스타일 명령 분할의 경우
shlex.split
Answer
를 사용합니다. SSH 이후 다른 시스템에서이 명령을 실행하려면 Paramiko라는 모듈을 사용해야 할 수 있습니다. 정말 유용합니다.
명령 실행이 로컬 시스템에서 수행되어야하는 경우 os 모듈 기능이 도움이 될 것입니다.
홈페이지 : https://www.paramiko.org/
bash
는 부풀어 오른 셸이었습니다 …os.system
문서에서는 모듈.