2009-08-19 17 views
5

Me acabo de convertir en el administrador del sistema para el grupo de mi grupo de investigación y, en este sentido, soy un novato. Estoy tratando de hacer algunas herramientas para monitorear la red y necesito ayuda para comenzar a implementarlas con Python (mi lengua materna).Interfaz con computadoras remotas usando Python

Por ejemplo, me gustaría ver quién está conectado a máquinas remotas. A mano, haría ssh y who, pero ¿cómo podría obtener esta información en un script para su manipulación? Algo así como,

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) 

Del mismo modo para cosas como cat /proc/cpuinfo para obtener la información del procesador de un nodo. Un punto de partida sería realmente genial. Gracias.

Respuesta

2

Aquí es una solución sencilla y barata para empezar

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

rendimientos (por ejemplo)

['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'] 

y para cpuinfo:

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

Agradable. Este fue el primer código que tengo para trabajar. Pregunta: ¿Sabes cuándo finaliza la conexión ssh? – physicsmichael

+0

justo después de ejecutar el comando. – Peter

+0

@Peter: si necesito una interacción con un host remoto (respuesta en las solicitudes, etc.) debería usar Pexpect o si hay una biblioteca incorporada con dicha funcionalidad – legesh

2

He estado usando Pexpect, lo cual le permite ingresar a máquinas, enviar comandos, leer la salida y reaccionar ante ella, con éxito. Incluso comencé un proyecto de código abierto alrededor de él, Proxpect - que no se han actualizado en años, pero estoy divagando ...

0

Esto cubre las bases. Observe el uso de sudo para cosas que necesitan más privilegios. Configuramos sudo para permitir esos comandos para ese usuario sin necesidad de escribir una contraseña.

Además, tenga en cuenta que debe ejecutar ssh-agent para que esto "tenga sentido". Pero en general, funciona realmente bien. Al ejecutar deploy-control httpd configtest, se comprobará la configuración de Apache en todos los servidores remotos.

#!/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

pexpect El módulo puede ayudar a la interfaz con ssh. Más o menos, aquí está lo que sería su ejemplo.

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

Esto está bien por ejemplo, pero tenga en cuenta que autenticar de esta manera generalmente se considera una mala idea. La autenticación SSH basada en claves públicas es más segura ... Y al menos no tiene que asegurarse de que su script no sea legible en todo el mundo después de cada edición accidental. – drdaeman

+0

La salida de 'child.sendline ('who')' parece ser el número 4 ... ¿Qué me estoy perdiendo? – physicsmichael

+0

Obtuve lo mismo con Pexpect, ¿qué se da con eso? – Jon

0

La tela es una manera sencilla de automatizar algunas tareas sencillas como esta, la versión actualmente estoy usando le permite envolver los comandos de este modo:

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

puede especificar las opciones de configuración (config .fab_user, config.fab_password) para cada máquina que necesite (si desea automatizar el manejo de la contraseña del nombre de usuario).

Más información sobre Tela aquí:

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

hay una nueva versión que es más Pythonic - No estoy seguro de si eso va a ser mejor para usted int su caso ... de obras bien para mí en este momento ...

1

Si sus necesidades crecen demasiado simple "ssh remote-host.example.org who", entonces hay una impresionante biblioteca de pitón, llamada RPyC. Tiene el llamado modo "clásico" que permite ejecutar de forma casi transparente el código de Python a través de la red con varias líneas de código. Herramienta muy útil para entornos de confianza.

He aquí un ejemplo 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 está interesado, hay a good tutorial on their wiki.

Pero, por supuesto, si está perfectamente bien con llamadas ssh usando Popen o simplemente no desea ejecutar un daemon "RPyC" por separado, entonces esto es definitivamente una exageración.