J'étudie actuellement les tests d' intrusion et la programmation Python. Je veux juste savoir comment j'exécuterais une commande Linux en Python. Les commandes que je veux exécuter sont:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080
Si je l’utilise seulement print
en Python et que je l’exécute dans le terminal, est-ce que cela fonctionnera de la même manière que si on le tapait soi-même et que l’on appuyait Enter?
bash
être une coquille gonflée ...os.system
recommander l'utilisation dusubprocess
module.Réponses:
Vous pouvez utiliser
os.system()
comme ceci:Ou dans votre cas:
Mieux encore, vous pouvez utiliser l'appel du sous-processus, il est plus sûr, plus puissant et probablement plus rapide:
Ou, sans invoquer shell:
Si vous voulez capturer la sortie, une façon de le faire est la suivante:
Je fortement recommande la fixation d' un
timeout
encommunicate
et aussi de capturer les exceptions que vous pouvez obtenir lors de l' appel. C'est un code très sujet aux erreurs, vous devez donc vous attendre à ce que des erreurs se produisent et les gérer en conséquence.https://docs.python.org/3/library/subprocess.html
la source
os.system
fonctionne toujours.subprocess.call
comme recommandé, vous devrez peut-être spécifiershell=True
... voir icidecode()
avec charset à partir d'LC_CTYPE
une variable d'environnement.La première commande écrit simplement dans un fichier. Vous n'exécuteriez pas cela en tant que commande shell car vous
python
pouvez lire et écrire dans des fichiers sans l'aide d'un shell:La
iptables
commande est quelque chose que vous pouvez exécuter en externe. La meilleure façon de procéder consiste à utiliser le module de sous - processus .Notez que cette méthode n’utilise pas non plus de shell, ce qui est une surcharge inutile.
la source
Le moyen le plus rapide:
Ce n'est pas l'approche la plus flexible; si vous avez besoin de plus de contrôle sur votre processus que "l'exécuter une fois, jusqu'à son achèvement, et le bloquer jusqu'à ce qu'il se ferme", vous devez alors utiliser le
subprocess
module.la source
En règle générale, vous feriez mieux d'utiliser des liaisons python chaque fois que possible (meilleure capture des exceptions, parmi d'autres avantages.)
Pour la
echo
commande, il est évidemment préférable d’utiliser python pour écrire dans le fichier comme suggéré dans la réponse de @ jordanm.Pour la
iptables
commande, peut - êtrepython-iptables
( la page PyPI , la page GitHub avec description et doc ) fournirait ce dont vous avez besoin (je n'ai pas vérifié votre commande spécifique).Cela vous obligerait à utiliser une bibliothèque externe, de sorte que vous devez pondérer les avantages. L'utilisation de sous-processus fonctionne, mais si vous souhaitez utiliser la sortie, vous devrez l'analyser vous-même et gérer les modifications de sortie dans les
iptables
versions futures .la source
subprocess
appels est moins utile. Oui, vous pouvez simuler les appels, mais les tests doivent émettre des hypothèses sur les résultats des appels externes.Une version python de votre shell. Attention, je ne l'ai pas testé.
la source
Si vous souhaitez exécuter cette commande sur un autre système après SSH, vous devrez peut-être utiliser le module nommé Paramiko. C'est vraiment utile.
Si l'exécution de la commande doit être effectuée à partir de la machine locale, les fonctions du module os seront utiles.
la source