Kontext

Kontext

Kontext

Ich möchte rsyncBackups meines Servers einrichten, also führe ich den folgenden Befehl aus

rsync -r -e ssh --rsync-path="sudo rsync" [email protected]:/ /backup/

Im Idealfall würde dieser Befehl nach meinem privaten SSH-Schlüsselkennwort fragen, dann eine Verbindung herstellen, dann das Sudo-Kennwort für rsyncuser abfragen und dann rsync auf dem Server ausführen. Aber ich bekam den berüchtigten Fehler:

sudo: no tty present and no askpass program specified

Daher musste ich dies zu /etc/sudoers(using sudo visudo) hinzufügen, was dem Benutzer im Grunde genommen vollen passwortlosen Lese- und Schreibzugriff auf das System gewährt rsyncuser, was nicht meinem Geschmack entspricht:

rsyncuser ALL= NOPASSWD:/usr/bin/rsync

Frage

Wie kann ich sudo stattdessen anweisen, sein Passwort beispielsweise von einem anderen TTY zu lesen?

Auf diese Weise könnte ich es rsyncin einem Terminalfenster auf meinem lokalen Computer ausführen und ein anderes Terminalfenster verwenden, um eine (möglicherweise separate) SSH-Verbindung zum Server zu öffnen und dort das Sudo-Passwort einzugeben.

Die einzige Möglichkeit, die mir einfällt, so etwas zu tun, wäre die Verwendung eines expectSkripts rund um sudo, das das Passwort aus einer benannten Pipe liest, und ich würde vom anderen Terminal aus in diese Pipe schreiben.

Hinweis: Dies dient eher dem Experimentieren und Lernen als einem praktischen Zweck.Ich versuche nicht herauszufinden, wie man sudo mit rsync verwendet, ich habe bereits alles gelesen, was ich dazu finden konnte.

Antwort1

sudoliest eine Umgebungsvariable, SUDO_ASKPASSwenn es nicht von einem Terminal aus ausgeführt wird (wie in Ihrem Fall) oder wenn -A gesetzt ist. Es verwendet dies als auszuführenden Befehl, um das Passwort abzurufen. Beispiel:

echo -e '#!/bin/sh\nhead -n 1' > ~/bin/reader
chmod a+x ~/bin/reader
export SUDO_ASKPASS="$HOME/bin/reader"
sudo -A echo "I'm root\!"

Sie werden über die Standardeingabe zur Eingabe des Kennworts aufgefordert. Ein Terminal ist nicht erforderlich.

Im konkreten Fall, in dem Sie es versuchen, wäre es jedoch möglicherweise besser, die Root-SSH-Anmeldung zuzulassen, allerdings nur mit einem SSH-Schlüssel und dem auf rsync beschränkten Befehl. Es gibt eine gute Ressource dazuHier.

Antwort2

Versuchen:

ssh userfoo@host "sudo -S p'enter pw: ' [command] "

Dadurch wird eine Kennwortabfrage (" enter pw:") ausgegeben, die auf Ihrem lokalen Host/Terminal angezeigt wird. Der Nachteil dabei ist das Sicherheitsrisiko, da Ihr Kennwort in Ihrem Terminalfenster im Klartext angezeigt wird. Es wird nicht auf Ihrem lokalen Computer gespeichert .bash_history, sondern ist der Scroll-Back-Verlauf des Terminalfensters. Wenn Sie also beispielsweise Konsole verwenden, verwenden Sie Ctrl+ Shift+, Kum dies zu löschen.

verwandte Informationen