26.02.2014 Aufrufe

ADMIN Magazin Gestapelt - Schneller und sicherer mit RAID (Vorschau)

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

Paramiko<br />

Programmieren<br />

sich <strong>mit</strong> »exec_command()« auf dem entfernten<br />

Rechner Befehle ausführen. Der<br />

Aufruf gibt jeweils einen Dateideskriptor<br />

für die Standardeingabe, die Standardausgabe<br />

<strong>und</strong> die Fehlerausgabe zurück.<br />

Listing 1 zeigt dafür ein Beispiel, das die<br />

Prozesstabelle auf dem entfernten Rechner<br />

ausgibt.<br />

Wer das Default-Verhalten, den Agent zu<br />

verwenden, abschalten will, kann der<br />

Methode »allow_agent=False« übergeben.<br />

Wer den SSH-Agent nicht verwenden<br />

kann oder will, muss sich anders behelfen.<br />

Paramiko bietet an, den zum Public<br />

Key (der auf dem Server liegt) passenden<br />

Private Key selbst zu laden. Dies geht<br />

einfach <strong>mit</strong> der Funktion<br />

pkey = paramiko.RSAKey.from_private_keyU<br />

(pkey_file)<br />

Es funktioniert aber nur, wenn der Private<br />

Key nicht <strong>mit</strong> einer Passphrase geschützt<br />

ist. Ist er dies aber, wie etwa dieser Key,<br />

more ~/.ssh/id_rsa<br />

‐‐‐‐‐BEGIN RSA PRIVATE KEY‐‐‐‐‐<br />

Proc‐Type: 4,ENCRYPTED<br />

muss man der obigen Methode die Passphrase<br />

als zweites Argument übergeben.<br />

Der Code in Abbildung 1 zeigt, wie man<br />

die Passphrase von der Standardeingabe<br />

liest <strong>und</strong> den Private Key da<strong>mit</strong> entschlüsselt,<br />

bevor man ihn an die Connect-<br />

Methode übergibt. Dabei darf man nicht<br />

vergessen, das die Eingabe abschließende<br />

Linefeed-Zeichen zu entfernen, sonst<br />

schlägt die Dekodierung fehl.<br />

Neben solchen SSH-Sessions deckt Paramiko<br />

auch die Datenübertragung per<br />

SFTP ab. Um eine entsprechende Verbindung<br />

zu öffnen, genügt es, die Methode<br />

»open_sftp()« des Paramiko-Clients aufzurufen,<br />

was wiederum ein SFTP-Objekt<br />

zurückliefert. Dieses Objekt bietet eine<br />

ganze Reihe von Methoden, die Shell-<br />

Befehlen oder den bekannten Kommandos<br />

in FTP-Clients ähneln. So wechselt<br />

»chdir()« in ein anderes Verzeichnis <strong>und</strong><br />

»listdir()« gibt den Inhalt eines Verzeichnisses<br />

aus.<br />

Es lassen sich aber auch Verzeichnisse<br />

anlegen, löschen <strong>und</strong> umbenennen. Dies<br />

übernehmen die Methoden »mkdir()«,<br />

»rmdir()« <strong>und</strong> »rename()«. Eine Datei<br />

löscht ein Aufruf von »remove()« oder<br />

»unlink()«.<br />

Auch für das Ändern des Dateieigentümers<br />

<strong>und</strong> der Zugriffsrechte bietet der<br />

SFTP-Client passende Methoden. Dies<br />

sind wie in der Shell »chown()« <strong>und</strong><br />

»chmod()«. Die beiden Methoden »get()«<br />

<strong>und</strong> »put()« holen eine Datei vom Server<br />

respektive speichern sie dort.<br />

Schließlich lässt sich eine Datei auch direkt<br />

auf dem Server anlegen, wenn man<br />

»file()« verwendet. So können Python-<br />

Skripts umstandslos Dateien auf dem<br />

Server speichern, ohne vorher lokal eine<br />

temporäre Kopie davon anzulegen. Eine<br />

vollständige Liste aller Funktionen findet<br />

sich in der API-Dokumentation des<br />

»SFTPClient«-Objekts unter [2].<br />

Einfacher<br />

Wem dies alles noch zu viel Aufwand ist,<br />

der sollte einen Blick auf den Paramiko-<br />

Wrapper eines Python-Anwenders verwenden,<br />

der sich online nur unter seinem<br />

Vornamen Zeth auftritt [7]. Mit seinem<br />

Modul gestaltet sich die Benutzung von<br />

SSH <strong>und</strong> SFTP per Python noch einmal<br />

einfacher:<br />

Abbildung 1: Paramiko verwendet die Keys des SSH-Agents, kann aber den Private Key auch selbst dekodieren.<br />

import ssh<br />

s = ssh.Connection('my.server.de')<br />

s.put('up.txt')<br />

s.get('down.txt')<br />

s.execute('du ‐h .')<br />

Der Wrapper ist natürlich nicht so gut<br />

getestet wie Paramiko selbst, <strong>und</strong> man<br />

hat weniger Kontrolle darüber, was hinter<br />

den Kulissen passiert.<br />

Obligatorisch<br />

Wer <strong>mit</strong> Python-Skripts per SSH auf andere<br />

Rechner zugreifen, dabei Kommandos<br />

ausführen oder Dateien übertragen<br />

will, kommt an Paramiko kaum vorbei.<br />

Das Modul hat eine lange Geschichte,<br />

viele Anwender <strong>und</strong> ist entsprechend<br />

gut getestet. Es arbeitet <strong>mit</strong> SSH-Agents<br />

zusammen, bietet auf Wunsch eigenes<br />

Key-Handling <strong>und</strong> ist im Detail konfigurierbar.<br />

Seit es Ende September 2012<br />

einen neuen Maintainer gef<strong>und</strong>en hat, ist<br />

nun auch seine Zukunft gesichert. n<br />

Infos<br />

[1] Python Info Wiki, Secure Shell: [http:// wiki.​<br />

python. org/ moin/ SecureShell]<br />

[2] Paramiko: [http:// www. lag. net/ paramiko/]<br />

[3] Homepage von Robey Pointer: [http://​<br />

robey. lag. net]<br />

[4] Python Package Index: Paramiko: [http://​<br />

pypi. python. org/ pypi/ paramiko/]<br />

[5] Github-Seite: [https:// github. com/​<br />

paramiko/ paramiko]<br />

[6] Pycrypto-Binaries für Windows: [http://​<br />

www. voidspace. org. uk/ python/ modules.​<br />

shtml# pycrypto]<br />

[7] Wrapper: [http:// zeth. net/ post/ 332/]<br />

Listing 1: Prozesstabelle anzeigen<br />

01 import os<br />

02 import sys<br />

03 import paramiko<br />

04 <br />

05 hostkeytype = None<br />

06 hostkey = None<br />

07 hostname = "server.domain.net"<br />

08 <br />

09 client = paramiko.SSHClient()<br />

10 client.load_host_keys(os.path.expanduser('~/.ssh/<br />

known_hosts'))<br />

11 client.connect(hostname, username="ofrommel")<br />

12 stdin, stdout, stderr = client.exec_command('ps ‐a')<br />

13 for line in stdout:<br />

14 print line.strip('\n')<br />

15 client.close()<br />

www.admin-magazin.de<br />

Admin<br />

Ausgabe 06-2012<br />

129

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!