私は現在、ペネトレーションテストと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
Pythonでprint
を使ってターミナルで実行した場合、自分で入力してEnterを押したのと同じように実行されますか?
次のように、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')
より良い方法は、subprocess's callを使用することです。
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))
私は、communicate
に timeout
を設定することを 非常に お勧めします。また、communicate
を呼び出したときに発生する例外をキャプチャすることもお勧めします。これは非常にエラーが発生しやすいコードなので、エラーが発生することを想定し、それに応じて処理する必要があります。
最初のコマンドは単にファイルに書き込むだけです。シェルの助けを借りなくてもpython
はファイルの読み書きができるので、シェルコマンドとしては実行しないでしょう。
with open('/proc/sys/net/ipv4/ip_forward', 'w') as f:
f.write("1")
iptables`コマンドは外部から実行したいと思うかもしれません。そのためには subprocess moduleを使うのが一番です。
import subprocess
subprocess.check_call(['iptables', '-t', 'nat', '-A',
'PREROUTING', '-p', 'tcp',
'--destination-port', '80',
'-j', 'REDIRECT', '--to-port', '8080'])
この方法はシェルを使用しないので、不必要なオーバーヘッドになることに注意してください。