![Kontext](https://rvso.com/image/50564/Kontext.png)
Kontext
Ich möchte rsync
Backups 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 rsync
in 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 expect
Skripts 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
sudo
liest eine Umgebungsvariable, SUDO_ASKPASS
wenn 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.