在Python中执行shell命令

在Python中执行shell命令

我目前正在学习渗透测试和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))

高度建议设置timeoutin communicate,并捕获调用它时可能出现的异常。这是一个非常容易出错的代码,因此您应该预料到会发生错误并相应地进行处理。

https://docs.python.org/3/library/subprocess.html

答案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

相关内容