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