![Python에서 쉘 명령 실행](https://linux55.com/image/75778/Python%EC%97%90%EC%84%9C%20%EC%89%98%20%EB%AA%85%EB%A0%B9%20%EC%8B%A4%ED%96%89.png)
나는 현재 공부하고 있다침투 테스트그리고 파이썬 프로그래밍. 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
그냥 print
파이썬에서 사용하고 터미널에서 실행하면 제가 직접 입력하고 누른 것과 똑같이 동작하나요 Enter?
답변1
다음과 같이 사용할 수 있습니다 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))
나높은호출 시 발생할 수 있는 예외를 설정하고 catch하는 timeout
것이 좋습니다 . communicate
이는 오류가 발생하기 쉬운 코드이므로 오류를 예상하고 그에 따라 처리해야 합니다.
답변2
첫 번째 명령은 파일에 쓰기만 합니다. 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'])
이 방법은 또한 불필요한 오버헤드인 셸을 사용하지 않는다는 점에 유의하세요.
답변3
가장 빠른 방법:
import os
os.system("your command here")
이것은 가장 유연한 접근 방식이 아닙니다. "한 번 실행하고 완료하고 종료할 때까지 차단"하는 것보다 프로세스에 대한 더 많은 제어가 필요한 경우 이 subprocess
모듈을 사용해야 합니다.
답변4
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