В настоящее время я изучаю тестирование на проникновение и программирование на 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?
bash
это раздутая оболочка ...os.system
рекомендации по использованиюsubprocess
модуля.Ответы:
Вы можете использовать
os.system()
, как это:Или в вашем случае:
Более того, вы можете использовать вызов подпроцесса, он безопаснее, мощнее и, скорее всего, быстрее:
Или без вызова оболочки:
Если вы хотите захватить вывод, один из способов сделать это так:
Я настоятельно рекомендую устанавливать
timeout
в системеcommunicate
, а также для захвата исключения вы можете получить при вызове его. Это очень подверженный ошибкам код, поэтому следует ожидать возникновения ошибок и обрабатывать их соответствующим образом.https://docs.python.org/3/library/subprocess.html
источник
os.system
до сих пор работает.subprocess.call
в соответствии с рекомендациями, вам может потребоваться указатьshell=True
... см. Здесьdecode()
с набором символов изLC_CTYPE
переменной среды.Первая команда просто записывает в файл. Вы не выполняете это как команду оболочки, потому что
python
можете читать и записывать файлы без помощи оболочки:Команда
iptables
- это то, что вы можете выполнить снаружи. Лучший способ сделать это - использовать модуль подпроцесса .Обратите внимание, что этот метод также не использует оболочку, что является ненужными накладными расходами.
источник
Самый быстрый способ:
Это не самый гибкий подход; если вам нужно больше контроля над процессом, чем «запустить его один раз, завершить и заблокировать до его завершения», тогда вам следует использовать
subprocess
модуль вместо этого.источник
Как правило, лучше использовать привязки Python, когда это возможно (среди прочего, лучше ловить исключения).
Для
echo
команды, очевидно, лучше использовать python для записи в файл, как предложено в ответе @ jordanm.Для
iptables
команды, может бытьpython-iptables
( страница PyPi , GitHub страницу с описанием и док ) обеспечит то , что вам нужно (я не проверял вашу конкретную команду).Это заставит вас зависеть от внешней библиотеки, поэтому вам придется взвесить все преимущества. Использование подпроцесса работает, но если вы хотите использовать выходные данные, вам придется проанализировать их самостоятельно и заняться изменениями выходных данных в будущих
iptables
версиях.источник
subprocess
вызовами менее полезен. Да, вы можете смоделировать вызовы, но тесты должны делать предположения о результатах внешних вызовов.Python-версия вашей оболочки. Будьте осторожны, я не проверял это.
источник
Если вы хотите выполнить эту команду в какой-то другой системе после SSH, вам, возможно, придется использовать модуль с именем Paramiko. Это действительно полезно.
Если выполнение команды должно выполняться с локальной машины, то функции модуля os будут полезны.
источник