2009-08-19 10 views
5

Właśnie zostałem administratorem systemu dla mojej grupy badawczej, i pod tym względem jestem nowicjuszem. Próbuję zrobić kilka narzędzi do monitorowania sieci i potrzebuję pomocy w rozpoczęciu ich implementacji za pomocą Pythona (mój język ojczysty).Interfejs ze zdalnymi komputerami za pomocą Pythona

Na przykład chciałbym zobaczyć, kto jest zalogowany na zdalnych komputerach. Ręcznie, ssh i who, ale w jaki sposób dostanę tę informację do skryptu do manipulacji? Coś podobnego,

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) 

Podobnie jak cat /proc/cpuinfo rzeczy, aby uzyskać informacje na temat procesora węzła. Punkt wyjścia byłby naprawdę świetny. Dzięki.

Odpowiedz

2

Oto proste, tanie rozwiązanie, aby zacząć

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

zwrotów (np)

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

i cpuinfo:

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

Nice. To był pierwszy kod, nad którym pracowałem. Pytanie: Czy wiesz, kiedy połączenie ssh jest zakończone? – physicsmichael

+0

zaraz po uruchomieniu polecenia. – Peter

+0

@Peter: jeśli potrzebuję interakcji ze zdalnym hostem (odpowiedź na pytania, itp.) Powinienem użyć Pexpect lub jest wbudowana biblioteka z taką funkcjonalnością – legesh

2

Używam Pexpect, co pozwala ci wsłuchiwać się w maszyny, wysyłać polecenia, czytać wyniki i reagować na nie z powodzeniem. Otworzyłem nawet projekt open source, Proxpect - który nie był aktualizowany od wieków, ale dygresja ...

0

Obejmuje to podstawy. Zwróć uwagę na użycie sudo dla rzeczy, które wymagają więcej przywilejów. Skonfigurowaliśmy sudo, aby zezwolić na te polecenia dla tego użytkownika bez konieczności wpisywania hasła.

Pamiętaj też, że powinieneś uruchomić ssh-agent, aby "to miało sens". Ale w sumie działa naprawdę dobrze. Uruchomienie deploy-control httpd configtest sprawdzi konfigurację apache na wszystkich serwerach zdalnych.

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

Moduł pexpect może pomóc w komunikacji z ssh. Mniej więcej, oto jak wyglądałby twój przykład.

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

Jest to na przykład dobre, ale należy pamiętać, że uwierzytelnianie w ten sposób jest ogólnie uważane za zły pomysł. Uwierzytelnianie SSH oparte na kluczach publicznych jest bezpieczniejsze ... Przynajmniej nie musisz się upewnić, że twój skrypt nie jest czytelny dla wszystkich po każdej przypadkowej edycji. – drdaeman

+0

Wyjście "child.sendline (" who ") wydaje się być numerem 4 ... Czego mi brakuje? – physicsmichael

+0

Mam to samo z pexpect, co daje z tym? – Jon

0

Fabric to prosty sposób zautomatyzować kilka prostych zadań, takich jak ten, w wersji obecnie używam pozwala zakończyć poleceń tak:

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

można określić opcje konfiguracyjne (config .fab_user, config.fab_password) dla każdej maszyny, której potrzebujesz (jeśli chcesz zautomatyzować obsługę haseł nazwy użytkownika).

Więcej informacji na tkaninie tutaj:

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

Pojawiła się nowa wersja, która jest bardziej pythonowy - Nie jestem pewien, czy będzie lepiej, int jego sprawy ... prace w porządku dla mnie w tej chwili ...

1

Jeśli twoje potrzeby przerastają prosty "ssh remote-host.example.org who", jest tam niesamowita biblioteka pythonów, o nazwie RPyC. Posiada tak zwany tryb "klasyczny", który pozwala na niemalże przejrzyste wykonanie kodu Pythona przez sieć za pomocą kilku linii kodu. Bardzo przydatne narzędzie dla zaufanych środowisk.

Oto przykład z Wikipedii:

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") 

Jeśli jesteś zainteresowany, nie a good tutorial on their wiki.

Ale oczywiście, jeśli masz całkowitą pewność, że połączenia ssh używają Popen lub po prostu nie chcesz uruchamiać oddzielnego demona "RPyC", to zdecydowanie jest to przesada.

Powiązane problemy