Executa comandos shell em Python

46

Atualmente estou estudando testes de penetração e programação em Python. Eu só quero saber como eu iria executar um comando do Linux em Python. Os comandos que quero executar são:

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080

Se eu apenas usar print no Python e executá-lo no terminal, ele fará o mesmo que executá-lo como se você estivesse digitando você mesmo e pressionando Enter ?

    
por iZodiac 23.10.2015 / 17:34

6 respostas

74

Você pode usar os.system() , assim:

import os
os.system('ls')

Ou no seu caso:

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')

Melhor ainda, você pode usar a chamada do subprocesso, é mais seguro:

from subprocess import call
call('ls')

link

    
por 23.10.2015 / 17:42
26

O primeiro comando simplesmente grava em um arquivo. Você não executaria isso como um comando shell porque python pode ler e gravar em arquivos sem a ajuda de um shell:

with open('/proc/sys/net/ipv4/ip_forward', 'w') as f:
    f.write("1")

O comando iptables é algo que você pode querer executar externamente. A melhor maneira de fazer isso é usar o módulo de subprocesso .

import subprocess
subprocess.check_call(['iptables', '-t', 'nat', '-A',
                       'PREROUTING', '-p', 'tcp', 
                       '--destination-port', '80',
                       '-j', 'REDIRECT', '--to-port', '8080'])

Observe que esse método também não usa um shell, o que é uma sobrecarga desnecessária.

    
por 23.10.2015 / 17:43
9

A maneira mais rápida:

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

Esta não é a abordagem mais flexível; Se você precisar de mais controle sobre seu processo do que "executá-lo uma vez, concluir e bloquear até sair", use o módulo subprocess .

    
por 23.10.2015 / 17:41
8

Como regra geral, é melhor usar as ligações do Python sempre que possível (melhor captura de exceção, entre outras vantagens).

Para o comando echo , obviamente é melhor usar o python para escrever no arquivo como sugerido na resposta do @jordanm.

Para o comando iptables , talvez python-iptables ( página do PyPi , Página do GitHub com descrição e doc ) forneceria o que você precisa (eu não verifiquei seu comando específico).

Isso faria com que você dependesse de uma biblioteca externa, então você tem que ponderar os benefícios. Usar o subprocesso funciona, mas se você quiser usar a saída, terá que analisá-la e lidar com as alterações de saída no futuro iptables versions.

    
por 23.10.2015 / 18:50
2

Uma versão em python do seu shell. Tenha cuidado, eu não testei isso.

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
    
por 11.09.2018 / 21:59
-1

Mas se você quiser executar este comando em algum outro sistema após o SSH, então você pode ter que usar o módulo chamado paramiko. É realmente útil

Se a execução do comando tiver que ser feita a partir da máquina local, as funções do módulo serão úteis.

    
por 15.12.2015 / 17:59

Tags