在 Python 中执行 shell 命令

iZo*_*iac 79 python

我目前正在学习渗透测试和 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
Run Code Online (Sandbox Code Playgroud)

如果我只是print在 Python 中使用并在终端中运行它,它会像执行它一样执行它,就像您自己输入并按 一样Enter吗?

Kir*_*ira 127

你可以使用os.system(),像这样:

import os
os.system('ls')
Run Code Online (Sandbox Code Playgroud)

或者在你的情况下:

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')
Run Code Online (Sandbox Code Playgroud)

更好的是,您可以使用子进程的调用,它更安全、更强大并且可能更快:

from subprocess import call
call('echo "I like potatos"', shell=True)
Run Code Online (Sandbox Code Playgroud)

或者,不调用 shell:

call(['echo', 'I like potatos'])
Run Code Online (Sandbox Code Playgroud)

如果要捕获输出,一种方法是这样的:

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))
Run Code Online (Sandbox Code Playgroud)

强烈建议设置一个timeoutin communicate,并捕获调用它时可以获得的异常。这是一个非常容易出错的代码,因此您应该预期会发生错误并相应地处理它们。

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

  • os.system 自 2.6 版起已弃用。Subprocess 是正确使用的模块。 (30认同)

jor*_*anm 32

第一个命令只是写入文件。您不会将其作为 shell 命令执行,因为python可以在没有 shell 帮助的情况下读取和写入文件:

with open('/proc/sys/net/ipv4/ip_forward', 'w') as f:
    f.write("1")
Run Code Online (Sandbox Code Playgroud)

iptables命令是您可能想要在外部执行的内容。最好的方法是使用subprocess 模块

import subprocess
subprocess.check_call(['iptables', '-t', 'nat', '-A',
                       'PREROUTING', '-p', 'tcp', 
                       '--destination-port', '80',
                       '-j', 'REDIRECT', '--to-port', '8080'])
Run Code Online (Sandbox Code Playgroud)

请注意,此方法也不使用外壳,这是不必要的开销。


Tom*_*unt 13

最快的方法:

import os
os.system("your command here")
Run Code Online (Sandbox Code Playgroud)

这不是最灵活的方法;如果您需要对流程进行更多控制而不是“运行一次,完成,然后阻塞直到退出”,那么您应该改用该subprocess模块。


Jér*_*ôme 8

作为一般规则,您最好尽可能使用 python 绑定(更好的异常捕获,以及其他优点。)

对于echo命令,按照@jordanm 的回答中的建议,使用 python 在文件中写入显然更好。

对于iptables命令,也许python-iptablesPyPi 页面带有描述和文档的 GitHub 页面)会提供您需要的内容(我没有检查您的特定命令)。

这将使您依赖外部库,因此您必须权衡好处。使用 subprocess 是可行的,但是如果您想使用输出,则必须自己解析它,并在未来iptables版本中处理输出更改。