2009-08-19 4 views
5

Je viens de devenir l'administrateur système de la grappe de mon groupe de recherche et, à cet égard, je suis novice. J'essaie de faire quelques outils pour surveiller le réseau et j'ai besoin d'aide pour commencer à les implémenter avec python (ma langue maternelle). Par exemple, j'aimerais voir qui est connecté sur des machines distantes. À la main, je ssh et who, mais comment puis-je obtenir cette information dans un script pour la manipulation? Quelque chose comme,Interface avec les ordinateurs distants utilisant Python

import remote_info as ri 
ri.open("foo05.bar.edu") 
ri.who() 

Out[1]: 
hutchinson tty7   2009-08-19 13:32 (:0) 
hutchinson pts/1  2009-08-19 13:33 (:0.0) 

De même pour des choses comme cat /proc/cpuinfo pour obtenir les informations de processeur d'un noeud. Un point de départ serait vraiment génial. Merci.

Répondre

2

Voici une solution simple, pas cher pour vous aider à démarrer

from subprocess import * 
p = Popen('ssh servername who', shell=True, stdout=PIPE) 
p.wait() 
print p.stdout.readlines() 

retours (par exemple)

['usr  pts/0  2009-08-19 16:03 (kakapo)\n', 
'usr  pts/1  2009-08-17 15:51 (kakapo)\n', 
'usr  pts/5  2009-08-17 17:00 (kakapo)\n'] 

et cpuinfo:

p = Popen('ssh servername cat /proc/cpuinfo', shell=True, stdout=PIPE) 
+0

Nice. C'était le premier code que j'ai eu à travailler. Question: Savez-vous quand la connexion ssh est terminée? – physicsmichael

+0

juste après l'exécution de la commande. – Peter

+0

@Peter: si j'ai besoin d'une interaction avec un hôte distant (réponse sur invite, etc) devrais-je utiliser Pexpect ou il y a une bibliothèque intégrée avec une telle fonctionnalité – legesh

2

Je me sers Pexpect, ce qui vous permet d'entrer dans les machines, d'envoyer des commandes, de lire la sortie et d'y réagir avec succès. J'ai même commencé un projet open-source autour de lui, Proxpect - qui n'ont pas été mis à jour depuis des lustres, mais je dis ...

0

Ceci couvre les bases. Notez l'utilisation de sudo pour les choses qui ont besoin de plus de privilèges. Nous avons configuré sudo pour autoriser ces commandes pour cet utilisateur sans avoir besoin d'un mot de passe tapé. De plus, gardez à l'esprit que vous devriez lancer ssh-agent pour que cela soit "logique". Mais dans l'ensemble, cela fonctionne vraiment bien. L'exécution de deploy-control httpd configtest vérifie la configuration d'Apache sur tous les serveurs distants.

#!/usr/local/bin/python 

import subprocess 
import sys 

# The [email protected]: for the SourceURLs (NO TRAILING SLASH) 
RemoteUsers = [ 
     "[email protected]", 
     "[email protected]", 
     ] 

################################################################################################### 
# Global Variables 
Arg        = None 


# Implicitly verified below in if/else 
Command = tuple(sys.argv[1:]) 

ResultList = [] 
################################################################################################### 
for UH in RemoteUsers: 
     print "-"*80 
     print "Running %s command on: %s" % (Command, UH) 

     #---------------------------------------------------------------------------------------------- 
     if Command == ('httpd', 'configtest'): 
       CommandResult = subprocess.call(('ssh', UH, 'sudo /sbin/service httpd configtest')) 

     #---------------------------------------------------------------------------------------------- 
     elif Command == ('httpd', 'graceful'): 
       CommandResult = subprocess.call(('ssh', UH, 'sudo /sbin/service httpd graceful')) 

     #---------------------------------------------------------------------------------------------- 
     elif Command == ('httpd', 'status'): 
       CommandResult = subprocess.call(('ssh', UH, 'sudo /sbin/service httpd status')) 

     #---------------------------------------------------------------------------------------------- 
     elif Command == ('disk', 'usage'): 
       CommandResult = subprocess.call(('ssh', UH, 'df -h')) 

     #---------------------------------------------------------------------------------------------- 
     elif Command == ('uptime',): 
       CommandResult = subprocess.call(('ssh', UH, 'uptime')) 

     #---------------------------------------------------------------------------------------------- 
     else: 
       print 
       print "#"*80 
       print 
       print "Error: invalid command" 
       print 
       HelpAndExit() 

     #---------------------------------------------------------------------------------------------- 
     ResultList.append(CommandResult) 
     print 


################################################################################################### 
if any(ResultList): 
     print "#"*80 
     print "#"*80 
     print "#"*80 
     print 
     print "ERRORS FOUND. SEE ABOVE" 
     print 
     sys.exit(0) 

else: 
     print "-"*80 
     print 
     print "Looks OK!" 
     print 
     sys.exit(1) 
1

Le module pexpect peut vous aider à vous connecter à ssh. Plus ou moins, voici à quoi ressemblerait votre exemple.

child = pexpect.spawn('ssh servername') 
child.expect('Password:') 
child.sendline('ABCDEF') 
(output,status) = child.sendline('who') 
+0

Ceci est bien par exemple, mais s'il vous plaît noter, qu'authentifier comme ceci est généralement considéré comme une mauvaise idée. L'authentification SSH basée sur une clé publique est plus sûre ... Et au moins, vous n'avez pas à vous assurer que votre script n'est pas lisible après chaque modification accidentelle. – drdaeman

+0

La sortie de 'child.sendline ('who')' semble être le numéro 4 ... Qu'est-ce qui me manque? – physicsmichael

+0

J'ai eu la même chose avec pexpect, que donne-t-il? – Jon

0

Le tissu est un moyen simple d'automatiser certaines tâches simples comme celui-ci, la version que je suis actuellement en utilisant permet d'envelopper les commandes comme ceci:

run('whoami', fail='ignore') 

vous pouvez spécifier les options de configuration (config .fab_user, config.fab_password) pour chaque machine dont vous avez besoin (si vous voulez automatiser la gestion des mots de passe).

Plus d'infos sur tissu ici:

http://www.nongnu.org/fab/

Il y a une nouvelle version qui est plus Pythonic - Je ne sais pas si cela va mieux pour vous int son cas ... travaux bien pour moi à l'heure actuelle ...

1

Si vos besoins dépassent le simple "ssh remote-host.example.org who" alors il ya une bibliothèque python impressionnante, appelée RPyC. Il a ce qu'on appelle le mode "classique" qui permet d'exécuter de manière quasi transparente le code Python sur le réseau avec plusieurs lignes de code. Outil très utile pour les environnements de confiance.

Voici un exemple de Wikipedia:

import rpyc 
# assuming a classic server is running on 'hostname' 
conn = rpyc.classic.connect("hostname") 

# runs os.listdir() and os.stat() remotely, printing results locally 
def remote_ls(path): 
    ros = conn.modules.os 
    for filename in ros.listdir(path): 
     stats = ros.stat(ros.path.join(path, filename)) 
     print "%d\t%d\t%s" % (stats.st_size, stats.st_uid, filename) 

remote_ls("/usr/bin") 

Si vous êtes intéressé, il y a a good tutorial on their wiki. Mais, bien sûr, si vous êtes parfaitement bien avec les appels SSH en utilisant Popen ou tout simplement ne voulez pas exécuter démon "RPyC" séparé, alors c'est certainement une exagération.

Questions connexes