我目前正在学习渗透测试和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
如果我只是print
在 Python 中使用并在终端中运行它,它的执行效果是否与您自己键入并按 一样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)
或者,不调用 shell:
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))
我高度建议设置timeout
in communicate
,并捕获调用它时可能出现的异常。这是一个非常容易出错的代码,因此您应该预料到会发生错误并相应地进行处理。
答案2
第一个命令只是写入文件。您不会将其作为 shell 命令执行,因为python
无需 shell 的帮助即可读取和写入文件:
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'])
请注意,此方法也不使用 shell,这是不必要的开销。
答案3
最快的方法:
import os
os.system("your command here")
这不是最灵活的方法;如果您需要对进程进行更多控制,而不是“运行一次、完成并阻止直到退出”,那么您应该使用该subprocess
模块。
答案4
shell 的 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