@barnybla: Ähm, die Zeile 13 liest eine Zeile von der Standardeingabe, entfernt das abschliessende Zeilenendezeichen, und bindet das ganze an den Namen `passphrase`. Das steht so in *Deinem* Programm. Warum schreibst Du das in Dein Programm, wenn Du das gar nicht so haben willst?
Ist auch eine recht umständliche Art, denn was spräche denn hier einfach gegen die `input()`-Funktion?
Der Code erstellt zwei `SSHClient`-Objekte und setzt bei einem die Policy für fehlende Hostkeys — und verwendet das dann gar nicht weiter. Das macht keinen Sinn. Entweder kann man das weg lassen, oder Du wolltest das `SSHClient`-Objekt weg lassen und die Policy auf dem anderen `SSHClient`-Objekt setzen.
`hostkeytype` und `hostkey` werden definiert, aber nirgends verwendet.
`SSHClient`-Objekte sind Kontextmanager, die sollte man mit der ``with``-Anweisung verwenden.
Das `os.path`-Modul würde ich in neuem Code nicht mehr verwenden wenn die Funktionalität in `pathlib` verfügbar ist.
`pkey_file` ist ein irreführender Name weil es sich gar nicht um eine Datei, sondern um einen Datei*namen* handelt. Man sollte auch keine kryptischen Abkürzungen in Namen verwenden. Wenn man `private_key` meint, sollte man nicht `pkey` schreiben.
`RSAKey.from_private_key` will als erstes Argument ein Dateiobjekt, keinen Dateinamen. Überhaupt solltest Du Dir die Dokumentation zu dieser Methode mal anschauen.
Die `strip()`-Methode muss man schon auch aufrufen. Sonst wird die Zeichenkettenrepräsentation von der Methode ausgegeben, und nicht die Zeichenkette ohne Whitespace am Anfang und am Ende. Man könnte alternativ dem `print()` auch sagen, dass man kein Zeilenende am Ende ausgegeben haben möchte.
Ungetestet:
Code: Alles auswählen
#!/usr/bin/env python3
from pathlib import Path
import paramiko
def main():
hostname = "192.168.100.12"
with paramiko.SSHClient() as client:
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
private_key_filepath = Path.home() / ".ssh" / "id_rsa"
passphrase = input()
with private_key_filepath.open(encoding="ascii") as private_key_file:
private_key = paramiko.RSAKey.from_private_key(
private_key_file, passphrase
)
client.connect(hostname, username="root", pkey=private_key)
_stdin, stdout, _stderr = client.exec_command(
"cp /root/test.call /var/log"
)
for line in stdout:
print(line, end="")
if __name__ == "__main__":
main()