J'écris un script pour automatiser certaines commandes de ligne de commande en Python. En ce moment je fais des appels donc:
cmd = "some unix command"
retcode = subprocess.call(cmd,shell=True)
Cependant, j'ai besoin d'exécuter certaines commandes sur une machine distante. Manuellement, je me connectais en utilisant ssh puis j'exécutais les commandes. Comment pourrais-je automatiser cela en Python? Je dois me connecter avec un mot de passe (connu) à la machine distante, donc je ne peux pas simplement utiliser cmd = ssh user@remotehost
, je me demande s'il y a un module que je devrais utiliser?
k = paramiko.RSAKey.from_private_key_file(keyfilename)
OUk = paramiko.DSSKey.from_private_key_file(keyfilename)
PUISssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
et enfinssh..connect(hostname=host, username=user, pkey=k)
.def run_cmd(host, cmd):
qui fait ce que vous voulez au début, mais vos besoins évoluent. Vous finissez par changer l'assistant pour le nouveau cas d'utilisation, ce qui change le comportement de l'ancienne utilisation existante. Planifiez en conséquence.Ou vous pouvez simplement utiliser commands.getstatusoutput :
Je l'ai beaucoup utilisé et cela fonctionne très bien.
Dans Python 2.6+, utilisez
subprocess.check_output
.la source
Avez-vous jeté un œil à Fabric ? Il vous permet de faire toutes sortes de choses à distance via SSH en utilisant python.
la source
J'ai trouvé que paramiko était un peu trop bas niveau et que Fabric n'était pas particulièrement bien adapté pour être utilisé comme bibliothèque, j'ai donc créé ma propre bibliothèque appelée spur qui utilise paramiko pour implémenter une interface légèrement plus agréable:
Si vous devez exécuter à l'intérieur d'un shell:
la source
spur
. Vous générez des commandes shell supplémentaires et vous vous retrouvez avec: quel 'mkdir'> / dev / null 2> & 1; echo $ ?; exec 'mkdir' '-p' '/ data / rpmupdate / 20130207142923'. Je voudrais aussi avoir accès à une plaineexec_command
. Il manque également la capacité à exécuter des tâches d'arrière - plan:nohup ./bin/rpmbuildpackages < /dev/null >& /dev/null &
. Par exemple, je génère un script zsh (rpmbuildpackages) en utilisant un modèle, puis je le laisse simplement fonctionner sur la machine. Peut-être que la capacité de surveiller de telles tâches en arrière-plan serait également intéressante (enregistrer les PID dans certains ~ / .spur).spur
apparemment ne fonctionne que sur les systèmes Unix car il a une dépendance surtermios
. Quelqu'un connaît-il une bonne bibliothèque pour Windows?SshShell
, il y a maintenant la possibilité de définir le type de shell. Si un shell minimal est utilisé en passantshell_type=spur.ssh.ShellTypes.minimal
, alors seule la commande brute est envoyée. L'implémentation des tâches d'arrière-plan semble directement un peu hors de portée pour Spur, mais vous devriez pouvoir exécuter la commande que vous avez décrite en appelant un shell par exempleshell.run(["sh", "-c", "nohup ./bin/rpmbuildpackages < /dev/null >& /dev/null &"]
).Rester simple. Aucune bibliothèque requise.
la source
Tous ont déjà indiqué (recommandé) l'utilisation de paramiko et je ne fais que partager un code python (on peut dire API) qui vous permettra d'exécuter plusieurs commandes en une seule fois.
pour exécuter des commandes sur différents nœuds, utilisez:
Commands().run_cmd(host_ip, list_of_commands)
Je vous remercie!
la source
J'ai utilisé un tas de paramiko (sympa) et pxssh (également sympa). Je recommanderais non plus. Ils fonctionnent un peu différemment mais ont un chevauchement d'utilisation relativement important.
la source
paramiko a finalement fonctionné pour moi après avoir ajouté une ligne supplémentaire, qui est vraiment importante (ligne 3):
Assurez-vous que le package paramiko est installé. Source originale de la solution: Source
la source
la source
Fonctionne parfaitement...
la source
La réponse acceptée n'a pas fonctionné pour moi, voici ce que j'ai utilisé à la place:
Vous pouvez également utiliser sshpass :
Références:
1. https://github.com/onyxfish/relay/issues/11
2. https://stackoverflow.com/a/61016663/797495
la source
Jetez un œil à
spurplus
, un wrapper que nous avons développé autourspur
qui fournit des annotations de type et quelques gadgets mineurs (reconnexion SFTP, md5, etc. ): https://pypi.org/project/spurplus/la source
Demander à l'utilisateur d'entrer la commande en fonction de l'appareil
auquel il se connecte. Le code ci-dessous est validé par PEP8online.com.
la source
Exemple ci-dessous, dans le cas où vous voulez des entrées utilisateur pour le nom d'hôte, le nom d'utilisateur, le mot de passe et le numéro de port.
la source