Pythonでシェルコマンドを実行する

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

ちょうどprintPythonで使用して端末で実行すると、私が直接入力して押したのと同じように動作しますか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'])

出力をキャプチャする場合、1つの方法は次のとおりです。

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))

高い呼び出し時に発生する可能性のある例外を設定してキャッチすることをお勧めしますtimeoutcommunicateこれはエラーが発生しやすいコードなので、エラーを予想してそれに応じて処理する必要があります。

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

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

関連情報