В настоящее время я изучаю тестирование на проникновение и программирование на 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('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))
Я настоятельно рекомендую установить 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'])
Обратите внимание, что этот метод также не использует оболочку, что является ненужным накладным расходом.
Самый быстрый способ:
import os
os.system("your command here")
Это не самый гибкий подход; если вам нужен больший контроль над процессом, чем "запустить его один раз, до завершения, и блокировать до выхода", то вместо этого следует использовать модуль subprocess
.
Как правило, вам лучше использовать привязки питона, когда это возможно (лучше улавливание исключений, среди других преимуществ.)
Для команды echo
, очевидно, лучше использовать python для записи в файл, как это предлагается в ответе @jordanm.
Для команды iptables
, возможно, python-iptables
(страница PyPi, [страница GitHub с описанием и doc](https:// github.com/ldx/python-iptables)) предоставит то, что вам нужно (я не проверяю).
Это заставит вас зависеть от внешней библиотеки, поэтому вы должны оценить преимущества. Использование подпроцесса работает, но если вы хотите использовать вывод, вам придется проанализировать его самостоятельно и разобраться с изменениями вывода в будущих версиях iptables
.
Питон версия вашей оболочки. Будьте осторожны, я не проверял это.
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
Если вы хотите выполнить эту команду в какой-либо другой системе после SSH, вам, возможно, придется использовать модуль с именем Paramiko. Это действительно полезно.
Если выполнение команды должно выполняться с локального компьютера, то будут полезны функции модуля os.
Домашняя страница: https://www.paramiko.org/
Разработка: https://github.com/paramiko/paramiko