Ich mache häufig Backups auf einem lokalen Laufwerk, das ich täglich mit einem Remote-Server synchronisieren möchte.
Der Zielserver ist nur für den SSH-Schlüsselzugriff (kein Kennwort) konfiguriert. Da mein primärer SSH-Schlüssel für diesen Server durch Passphrasen geschützt ist, habe ich einen zweiten SSH-Schlüssel (nicht durch Passphrasen geschützt) + Benutzer erstellt, der für unbeaufsichtigte Sicherungen verwendet werden kann. Auf diese Weise muss ich nicht anwesend sein, um meine Passphrase einzugeben, wenn cron ausgeführt wird .
Ich verwende cron und rsync und alle Befehle funktionieren einzeln, scheitern jedoch, wenn sie kombiniert werden.
Die am weitesten entfernte während der Fehlerbehebung
env -i sh -c "rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/"
Das gibt den Fehler zurück
Permission denied (publickey).
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(226) [sender=3.1.0]
Irgendwelche Tipps zur weiteren Fehlerbehebung?
Folgendes habe ich bisher versucht und mir fehlen die Ideen:
- Cron rennt definitiv
ps aux | grep cron
Nichts ungewöhnliches in / var / log / syslog
Sep 7 13:22:01 desktop CRON[6735]: (tom) CMD (sh /home/tom/Documents/Scripts/offsite-backup)
SSH im Terminal zum Remote-Server, während der Sicherungsbenutzer arbeitet
ssh [email protected]
- Das Ausführen des Befehls in Terminal funktioniert einwandfrei
rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/
Die manuelle Angabe des Pfads zum Backup-Benutzerschlüssel hat keine Auswirkung
rsync -lrstRO --delete --exclude 'lost+found' -e 'ssh -i /home/tom/.ssh/backups-only' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/
Das Ersetzen des nicht funktionierenden Befehls durch einen einfachen Testbefehl funktioniert
echo "Hello world" > ~/Desktop/test.txt
Schreien / Fluchen am Computer hatte keine Auswirkung (aber ich fühlte mich vorübergehend besser).
Bearbeiten 1:
Hier ist meine crontab-Datei und das Skript, das sie aufruft.
...
# m h dom mon dow command
MAILTO=""
* * * * * sh /home/tom/Documents/Scripts/offsite-backup
und
#!/bin/bash
rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/
Bearbeiten 2:
Nur zur Verdeutlichung, /var/log/auth.log
auf dem Zielserver steht die Zeile. Sep 11 08:23:01 <hostname> CRON[24421]: pam_unix(cron:session): session closed for user root
Dies ist verwirrend, da ich nicht mehr jede Minute lokal cron laufen lasse, aber trotzdem jede Minute ein neuer Eintrag in den Serverprotokollen erscheint. Crontab-Dateien für alle Benutzer (einschließlich Root) auf dem Server sind leer und führen keine Aktionen aus .
Außerdem wurden Benutzer-Backups nur auf dem Server und mit eingeschränkten Rechten erstellt, wobei ein dedizierter SSH-Schlüssel auf meinen Desktop-Computer kopiert wurde. Ich gehe davon aus, dass dies der richtige Weg ist, da alles funktioniert, wenn die Befehle manuell ausgeführt werden.
Die oben angegebene crontab-Datei ist für mich, Benutzer 'tom', auf meinem Desktop-Computer. Ich möchte, dass es das Skript aufruft, das sich als Benutzer "Nur-Backups" beim Server anmelden soll. Ich habe gerade versucht, das Backup-Skript auszuführen (und nicht den darin enthaltenen Befehl), und es hat erfolgreich eine Verbindung hergestellt und funktioniert. Ich habe es auf meinem Desktop als Benutzer 'tom' ausgeführt, der auch den Cron-Job erstellt hat, der nicht funktioniert. Hier ist die Ausgabe aus dem Serverprotokoll, die dieser erfolgreichen Anmeldung entspricht
Sep 11 08:35:31 <hostname> sshd[25071]: error: Could not load host key: /etc/ssh/ssh_host_ed25519_key
Sep 11 08:35:32 <hostname> sshd[25071]: Accepted publickey for backups-only from <desktop IP> port 54242 ssh2: RSA e2:e6:07:27:c1:continues...
Sep 11 08:35:32 <hostname> sshd[25071]: pam_unix(sshd:session): session opened for user backups-only by (uid=0)
Sep 11 08:35:32 <hostname> systemd-logind[638]: New session 12 of user backups-only.
Sep 11 08:36:00 <hostname> sshd[25133]: Received disconnect from <desktop IP>: 11: disconnected by user
Sep 11 08:36:00 <hostname> sshd[25071]: pam_unix(sshd:session): session closed for user backups-only
Sep 7 14:45:01 <hostname> CRON[18716]: pam_unix(cron:session): session closed for user root
Sep 7 16:06:02 <hostname> sshd[6747]...
. Sind Sie zu 100% sicher, dass diese Protokollzeile vom Server stammt und die richtige Zeile ist? Die Crontab, die Sie gepostet haben, ist die Crontab nur für Backups ? Versuchen Sie auch, die Identität Datei manuell hinzuzufügen:rsync .... -e 'ssh -i /home/user/.ssh/identity' ...
auth.log
Ihrem Beitrag unter "Bearbeiten 2" für Cron bestimmt, die auf dem Server ausgeführt wird, und sollte nichts mit Ihren Anmeldeversuchen zu tun haben. Können Sie estail -f /var/log/auth.log
auf dem Server versuchen, während Sie versuchen, das Skript über cron auszuführen? Ich bin mir auch nicht sicher, ob dies funktionieren würde, aber können Sie Ihren erstenenv
Befehl mit versuchen, umrsync .... -e 'ssh -vvv -i /home/user/.ssh/identity ...
zu sehen, ob er mehr Fehler ausgibt?Antworten:
Da von der Befehlszeile aus alles einwandfrei funktioniert,
Permission denied (publickey)
bedeutet der Fehler , dass der SSH-Teil vonrsync
eine andere Identitätsdatei als der angegebene Benutzername verwendet.Aus Jan's Kommentar zur ursprünglichen Frage können wir die Identitätsdatei im
rsync
Befehl mit angeben-e 'ssh -i /path/to/identity.file' ...
.Die Verwendung des folgenden Befehls, um mit einer neuen Umgebung in Cron zu beginnen und den vollständigen Pfad zur Datei anzugeben, löst anscheinend das Problem:
Ich bin immer noch sehr an dieser Entdeckung interessiert. Das hängt wahrscheinlich mit cron, der Tatsache, dass es mit minimalen Umgebungsvariablen beginnt, und dem ssh-Agenten zusammen. Ich werde das gleiche Szenario in ein paar Tagen einrichten, um es zu testen und einen Bericht zu erstellen.
quelle
env -i sh -c "rsync -lrstRO --delete --exclude 'lost+found' -e 'ssh -i /path/to/identity.file' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/"
Ich habe gerade dieses Problem gelöst, das mich beschäftigt hat ..
Verbindung in RSYNC über SSH kann nicht hergestellt werden, obwohl die Identität für SSH festgelegt wurde ... Es wird nichts unternommen ... Rsync sagt "Erlaubnis verweigert" und ssh sagt "read_passphrase: kann / dev / tty nicht öffnen: Kein Gerät oder Adresse von dieser Typ"
Aber ich habe einen Beitrag gelesen, in dem erklärt wurde, dass die crontab eine eigene Umgebung hat, die nicht mit root identisch ist. Das wusste ich bereits, aber ich verstand nicht, welche Auswirkungen es auf SSH haben könnte, wenn ich den SSH-AGENT verwende
Mein SSH-Schlüsselaustausch erfolgt jedoch mit PassPhrase. Wenn die Umgebung also anders ist und mein RSYNC über SSH eine Passphrase erwartet, die nicht eingegeben werden kann => SSH-Debug-Informationen geben auch den Fehler an:
Auf meinem Computer verwende ich "Schlüsselbund", um den SSH-Agenten zu starten, damit ich die Passphrase nicht jedes Mal neu eingeben muss, wenn ich eine Remoteverbindung versuche. Der Schlüsselbund generiert eine Datei mit den folgenden Informationen
==> Der Befehl SSH-AGENT gibt die gleichen Informationen zurück.
Letztendlich sind es also diese Informationen, die sich auf die aktuelle Sitzung beziehen, die zukünftige Authentifizierungen der aktuellen Sitzung ermöglichen, ohne dass die Passphrase eingegeben werden muss, da sie bereits zuvor erstellt und gespeichert wurde.
==> Die Lösung ist da ... es reicht aus, wenn das Skript von der crontab gestartet wird und die Datei, die diese Informationen enthält, als "Quelle" angegeben oder in der Befehlszeile der crontab ausgeführt wird ...
=> Mit diesem Sourcing machen Sie sich keine Sorgen mehr. Die Informationen von SSH_AUTH_SOCK und SSH_AGENT_PID werden in die Umgebung des Crontab geladen und sind daher bekannt, dass RSYNC über SSH problemlos funktioniert.
Es hat mich beschäftigt, aber jetzt funktioniert es :)
quelle
Vorsichtsmaßnahme für Benutzer von SSH Agent Forwarding:
Wenn Sie dieses Verhalten beim Debuggen eines Skripts auf einem Remote-Host
-e "ssh -i /path/to/key"
feststellen, wird ssh auch mit dem Flag Ihren lokalen (weitergeleiteten) Schlüssel verwenden und nicht den auf dem Server.Konkretes Beispiel: Ich habe ein Skript auf dem Entwicklungsserver, das Daten vom "Datenserver" mit rsync über ssh abruft. Wenn ich mich beim Dev-Server anmelde und ihn starte, ist alles in Ordnung, aber wenn ich von Cron aus starte, wird mir die Erlaubnis verweigert. Wenn
-vv
ich dem SSH-Prozess (Flag ) etwas Ausführlichkeit hinzufüge, ist mir Folgendes aufgefallen:Was mir hier aufgefallen ist, dass ich zufällig einen anderen Benutzernamen auf dem lokalen Host ("nighty") als auf dem Entwickler-Server ("juanr") habe.
Beachten Sie, dass der Schlüssel auf dem Dev-Server als "explizit" markiert wird, aber weiterhin der weitergeleitete Schlüssel von meinem Laptop zum Anmelden verwendet wird. Wenn Sie
ssh-copy-id
an dieser Stelle einen ausführen, wird nichts aufgelöst, da nur der weitergeleitete Schlüssel und nicht der vom Dev neu installiert wird Server. Wenn Sie ssh-copy-id mit Agent - Forwarding verwenden, müssen Sie angeben , welche Taste mit dem Flag -i zu installieren:ssh-copy-id -i ~/.ssh/id_rsa.pub user@host
.quelle
Haben Sie bereits den alten Trick ausprobiert, die Hosts-Dateien zu bereinigen? Ich meine:
Es lohnt sich zu versuchen, da ssh es wieder aufbaut und Sie abgestandenes Zeug loswerden. Sie können natürlich auch die Teile entfernen, die zu einer bestimmten IP / einem bestimmten Host gehören.
Weitere Fragen: Wird Ihr Cron-Job unter Ihrer UID oder als Benutzer Cron oder Root ausgeführt?
quelle
~/.ssh/known_hosts
etwas ändern würde. Und cron wird als mein Benutzer 'tom' auf dem Desktop ausgeführt, mit der Absicht, sich mit dem entsprechenden (kennwortlosen) SSH-Schlüssel, der sich in Benutzer tom befindet, als Benutzer 'backups only' beim Server anzumelden~/.ssh
.-r
noch das-f
Flag werden zum Löschenknown_hosts
benötigt - es ist eine reguläre Datei (kein Verzeichnis) und nicht schreibgeschützt.rm .ssh/known-hosts
wäre erheblich sicherer, wenn man bedenkt, dass ein Tippfehler mit einem Zeichen - das versehentliche Hinzufügen eines Leerzeichens zwischen.
undssh/known_hosts
nachrm -rf
(oderrm -r
) - normalerweise den gesamten Inhalt des privaten Ordners des Benutzers löscht!Verwenden Sie das
rrsync
Skript zusammen mit einem dedizierten SSH-Schlüssel wie folgt:REMOTE-Server
LOKALER Computer
Entfernter Computer
Stellen Sie der neu hinzugefügten Zeile Folgendes voran
Damit sieht das Ergebnis so aus
LOKAL
Fügen Sie
crontab
mitx
Erlaubnis das folgende Skript ein :Quelle: http://www.guyrutenberg.com/2014/01/14/restricting-ssh-access-to-rsync/
quelle
Um zu versuchen und zu debuggen, fügen Sie dem ssh-Teil "ssh -v" hinzu. Auf diese Weise können Sie den ausführlichen Modus mit einigen hilfreichen Informationen abrufen.
Bearbeiten: Auf der Manpage:
quelle
Ich denke, Sie haben die Datei sshd_config nicht richtig konfiguriert. Überprüfen Sie dies
PermitRootLogin yes
undPubkeyAuthentication yes
für die Fernwartung.quelle
PermitRootLogin
aktiviert und habe nicht vor, das zu ändern. Die beste Vorgehensweise ist, es zu deaktivieren und ssh nur als normaler Benutzer (fügen Sie sie gegebenenfalls Ihren "sudoers" hinzu) und niemals als root.