Ich möchte rsync in einem Python-Skript verwenden. Ich rufe es über das subprocess
Modul auf und authentifiziere mich über öffentliche Schlüssel, die in der authorized_key
Datei auf dem Remotecomputer gespeichert sind.
Das einzige Problem besteht darin, dass ich zur Eingabe eines Kennworts aufgefordert werde, wenn ich rsync mit einem falschen Remote-Benutzernamen verwende, wodurch das Sicherungsskript offensichtlich für immer angehalten wird.
Kann ich rsync
bei fehlgeschlagener Authentifizierung ein Beenden mit einem Fehler erzwingen, anstatt zur Eingabe eines Kennworts aufzufordern?
Udi
Antwort1
Vorausgesetzt, Sie verwenden rsync mit einer SSH-Remote-Shell (und nicht – beispielsweise – mit einem rsync-Server), können Sie rsync dazu bringen, SSH so auszuführen, dass nie nach einem Passwort gefragt wird. Sie können beispielsweise diesen Aufruf verwenden:
rsync -e 'ssh -o "NumberOfPasswordPrompts 0"' source user@target:/path
Dadurch wird rsync gezwungen, SSH mit 0 möglichen Passwortversuchen zu verwenden. Wenn es mit einer anderen Authentifizierungsmethode (wie einem öffentlichen Schlüssel oder GSSAPI) keinen Zugriff erhält, schlägt es mit einem Fehler fehl. Beachten Sie, dass rsync dies nicht mag und sich lautstark bei STDERR beschwert und mit dem Exitcode 255 abbricht.
Antwort2
Hier sind die Befehlszeilenoptionen für SSH, die ich verwende, um es leise zu halten.
ssh -o stricthostkeychecking=no -o userknownhostsfile=/dev/null -o batchmode=yes -o passwordauthentication=no
Sie benötigen den Hostkey-Kram nur, wenn Sie Ihre known_hosts-Datei nicht pflegen und Angst vor MitM-Warnungen haben. Anstatt die Authentifizierungstypen anzugeben, wie von James F vorgeschlagen, musste ich die Kennwortauthentifizierung explizit einschränken. Ich verwende dies jedoch, um Hunderte von Hosts mit ein paar unterschiedlichen Betriebssystemversionen zu erreichen, es kann also einfach eine Inkompatibilität sein.
Antwort3
Betreff: Vorschlag von James (kein tty), versuchen Sie für den Unterprozess, stdin=None als Parameter für Popen einzugeben.
Antwort4
Je nachdem, wie Sie rsync starten, kann es hilfreich sein, ihm kein TTY oder PTY zuzuweisen.
Viele Programme prüfen, ob sie über ein steuerndes TTY verfügen, bevor sie den Benutzer zur Eingabe auffordern. Das Standardverhalten von system() und ähnlichen Aufrufen besteht darin, Unterprogrammen ein TTY bereitzustellen. Sie können dies jedoch deaktivieren.
Es ist möglicherweise auch möglich, die Kennwortauthentifizierung auf der Remote-Seite vollständig zu deaktivieren, wenn Sie die Kontrolle über beide Systeme haben und aus Sicherheitsgründen bei der Lösung dieses Problems auf die Kennwortauthentifizierung verzichten möchten.
Wenn Sie rsync über SSH ausführen, können Sie Ihrer ssh_config-Datei für den betreffenden Host oder über den Befehlszeilenschalter -o Folgendes hinzufügen:
PreferredAuthentications publickey
Bei einem kurzen Test (nur SSH, nicht Rsync) führte dies dazu, dass SSH sofort beendet wurde, als mein öffentlicher Schlüssel nicht akzeptiert wurde, ohne dass ich zur Eingabe eines Kennworts aufgefordert wurde.