Наразі я вивчаю тестування на проникнення та програмування на 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))
Я наполегливо рекомендую встановлювати тайм-аут
у communicate
, а також перехоплювати винятки, які ви можете отримати при його виклику. Це дуже схильний до помилок код, тому слід очікувати, що помилки траплятимуться і обробляти їх відповідним чином.
Перша команда просто записує у файл. Ви не будете виконувати її як команду оболонки, тому що 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'])
Зауважте, що цей метод також не використовує оболонку, що є непотрібними накладними витратами.
Найшвидший шлях:
import os
os.system("your command here")
Це не найгнучкіший підхід; якщо вам потрібен більший контроль над процесом, ніж &quo ;запустити його один раз, до завершення, і заблокувати до його виходу&quo ;, то вам слід скористатися модулем підпроцесу.