web-dev-qa-db-ja.com

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

Python=でprintを使用してターミナルで実行すると、自分で入力してを押した場合と同じように実行されます Enter

70
iZodiac

次のように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))

私はhighlytimeoutcommunicateに設定すること、およびそれを呼び出すときに取得できる例外をキャプチャすることをお勧めします。これは非常にエラーが発生しやすいコードであるため、エラーが発生することを想定し、それに応じてエラーを処理する必要があります。

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

114
Kira

最初のコマンドは、単にファイルに書き込みます。 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'])

このメソッドもシェルを使用しないことに注意してください。これは不要なオーバーヘッドです。

30
jordanm

最速の方法:

import os
os.system("your command here")

これは最も柔軟な方法ではありません。 「一度実行して完了し、終了するまでブロックする」よりもプロセスを制御する必要がある場合は、代わりにsubprocessモジュールを使用する必要があります。

13
Tom Hunt

一般的なルールとして、可能な限りpython bindingsを使用することをお勧めします(他の利点の中でも特に、例外の捕捉が向上します)。

echoコマンドの場合、@ jordanmの回答で提案されているように、pythonを使用してファイルに書き込むことをお勧めします。

iptablesコマンドの場合、多分python-iptablesPyPiページ説明とドキュメントを含むGitHubページ )は、必要なものを提供します(特定のコマンドは確認しませんでした)。

これは外部のlibに依存することになるので、メリットを重視する必要があります。サブプロセスの使用は機能しますが、出力を使用したい場合は、それを自分で解析し、将来のiptablesバージョンでの出力の変更に対処する必要があります。

8
Jérôme

A 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
2
Timothy Pulliam

SSH後に他のシステムでこのコマンドを実行する場合は、Paramikoという名前のモジュールを使用する必要がある場合があります。本当に便利です。

コマンドの実行をローカルマシンから行う必要がある場合は、osモジュール関数が役立ちます。

ホームページ: https://www.paramiko.org/

開発: https://github.com/paramiko/paramiko

0