Выполнение команд оболочки в Python

В настоящее время я изучаю тестирование на проникновение и программирование на Python. Я просто хочу знать, как я собираюсь выполнить команду Linux в Python. Команды, которые я хочу выполнить:

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 ?

Вы можете использовать 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('ls') 

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

Первая команда просто записывает в файл. Вы не выполнили бы это как команду оболочки, потому что 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']) 

Обратите внимание, что этот метод также не использует оболочку, что лишние накладные расходы.

Как правило, вам лучше использовать привязки python, когда это возможно (лучше исключение извлечения, среди других преимуществ).

Для команды echo , очевидно, лучше использовать python для записи в файл, как это было предложено в ответе @ jordanm.

Для команды iptables возможно, что python-iptables ( страница PyPi, страница GitHub с описанием и doc ) предоставят вам то, что вам нужно (я не проверял вашу конкретную команду).

Это заставило бы вас зависеть от внешней библиотеки, поэтому вам нужно будет весить преимущества. Использование подпроцессов работает, но если вы хотите использовать вывод, вам придется самому разобрать его и обработать выходные изменения в будущих версиях iptables .

Самый быстрый способ:

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

Это не самый гибкий подход; если вам нужен какой-либо контроль над вашим процессом, чем «запустить его один раз, до завершения и заблокировать до его завершения», тогда вы должны использовать модуль subprocess .

Но если вы хотите выполнить эту команду в какой-то другой системе после SSH, вам, возможно, придется использовать модуль, называемый paramiko. Это действительно полезно

Если выполнение команды должно выполняться с локального компьютера, то функции модуля os будут полезны.