Atualmente, estou estudando testes de penetração e programação Python. Eu só quero saber como eu iria executar um comando Linux em Python. Os comandos que eu 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
em Python e executá-lo no terminal, ele fará o mesmo que executá-lo, como se você estivesse digitando e pressionando Enter?
bash
era uma concha inchado ...os.system
recomendar o uso dosubprocess
módulo.Respostas:
Você pode usar
os.system()
, assim:Ou no seu caso:
Melhor ainda, você pode usar a chamada do subprocesso, é mais segura, mais poderosa e provavelmente mais rápida:
Ou, sem chamar o shell:
Se você deseja capturar a saída, uma maneira de fazer isso é assim:
I altamente recomendável definir uma
timeout
emcommunicate
, e também para capturar as exceções que você pode começar quando chamá-lo. Este é um código muito propenso a erros, portanto, espere que ocorram erros e os manipule adequadamente.https://docs.python.org/3/library/subprocess.html
fonte
os.system
ainda funciona.subprocess.call
como recomendado, você pode precisar especificarshell=True
... veja aquidecode()
com charset daLC_CTYPE
variável de ambiente.O primeiro comando simplesmente grava em um arquivo. Você não executaria isso como um comando do shell, porque
python
pode ler e gravar em arquivos sem a ajuda de um shell:O
iptables
comando é algo que você pode querer executar externamente. A melhor maneira de fazer isso é usar o módulo de subprocesso .Observe que esse método também não usa um shell, o que é uma sobrecarga desnecessária.
fonte
A maneira mais rápida:
Essa não é a abordagem mais flexível; se você precisar de mais controle sobre seu processo do que "execute-o uma vez até a conclusão e bloqueie até que ele saia", use o
subprocess
módulo.fonte
Como regra geral, é melhor usar as ligações python sempre que possível (captura melhor de exceções, entre outras vantagens).
Para o
echo
comando, é obviamente melhor usar python para escrever no arquivo, conforme sugerido na resposta do @ jordanm.Para o
iptables
comando, talvezpython-iptables
( página PyPi , página GitHub com descrição e doc ) forneça o que você precisa (não verifiquei seu comando específico).Isso faria você depender de uma lib externa, então você deve ponderar os benefícios. O uso do subprocesso funciona, mas se você quiser usar a saída, será necessário analisá-la e lidar com as alterações na saída em
iptables
versões futuras .fonte
subprocess
chamadas é menos útil. Sim, você pode simular as chamadas, mas os testes precisam fazer suposições sobre os resultados nas chamadas externas.Uma versão python do seu shell. Cuidado, eu não testei.
fonte
Se você deseja executar este comando em algum outro sistema após o SSH, pode ser necessário usar o módulo chamado Paramiko. Isso é realmente útil.
Se a execução do comando precisar ser realizada na máquina local, as funções do módulo OS serão úteis.
fonte