ubuntuusers.de

ssh und rsync: funktioniert manuell, nicht als skript

Status: Ungelöst | Ubuntu-Version: Ubuntu 10.04 (Lucid Lynx)
Antworten |

jones79

Anmeldungsdatum:
23. Juni 2009

Beiträge: 79

Hallo!

Ich steh grad irgendwo auf dem Schlauch... ☺) Könnt Ihr mir weiterhelfen?

Mein Backupskript sieht im Prinzip so aus:

1
2
#!/bin/bash
sudo rsync -azvvv --modify-window=2 -e 'ssh -i /home/administrator/.ssh/id_rsa' --stats --progress --delete --delete-excluded --exclude-from=/home/administrator/.rsync/exclude.txt --log-file=/home/administrator/.rsync/rsync_dns323.log / root@DLINK-16G314:/mnt/HD_a2/administrator/RAIDBackup/ 2> /home/administrator/.rsync/error_dns323.log

Wird natürlich alles über Variablen gesetzt, aber das ist der Befehl, der am Ende hinten rauskommt.

Das Problem ist jetzt, dass das Skript beim Ausführen mit

[sender] _exit_cleanup(code=1, file=main.c, line=363): about to call exit(1)

abbricht.

Da das Skript aber per echo den Befehl vor dem Ausführen einfach ausspuckt, kann ich den direkt im Terminal ausführen und dann funktioniert alles einwandfrei.

Ich hab irgendwie das Gefühl, dass es was mit dem eingebetteten ssh-Befehl und doppelten oder einfachen Anführungsstrichen zu tun hat, aber ich finds einfach nicht...

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21818

Wohnort: Lorchhausen im schönen Rheingau

  1. Wenn dein Skript "im Prinzip" so aussieht, wie sieht es denn dann wirklich aus?

  2. Das Leerzeichen zwischen 2> und /home/[...] muss afaik weg

  3. du führst das mit sudo aus? root hat eigentlich keine leserechte auf ~/.ssh/id_rsa bzw verweigern viele Anwendungen der Start, wenn die rechte nicht stimmen. Kontrolliere das.

  4. ist das ein cronjob? Dann absolute Pfade angeben, vermutlich auch für ssh

jones79

(Themenstarter)

Anmeldungsdatum:
23. Juni 2009

Beiträge: 79

hi!

1.)

Hier mal ein Ausschnitt... Das ganze Skript ist bischen wild ☺ Da gibts noch if-Klauseln, die auf vorhandene verzeichnisse prüfen o.ä.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
HOST="root@DLINK-16G314"
SOURCEDIR="/"
TARGETDIR="/mnt/HD_a2/administrator/RAIDBackup/"
SSHDIR=$HOST":"$TARGETDIR
SSHKEY="/home/administrator/.ssh/id_rsa"
LOGFILE2="/home/administrator/.rsync/rsync_dns323.log"
LOGPARAMETER="--log-file="$LOGFILE2
ERRORLOG="/home/administrator/.rsync/error_dns323.log"
OPTIONS="-azvvv --modify-window=2 -e 'ssh -i $SSHKEY' --stats --progress --delete --delete-excluded"
EXCLUDES="--exclude-from=/home/administrator/.rsync/exclude.txt"

echo "sudo rsync $OPTIONS $EXCLUDES $LOGPARAMETER $SOURCEDIR $SSHDIR 2> $ERRORLOG"
sudo rsync $OPTIONS $EXCLUDES $LOGPARAMETER $SOURCEDIR $SSHDIR 2> $ERRORLOG

2.) ist glaub bei einer datei egal, nur wenns

2>&1

lautet muss es wohl direkt dran sein

3.) sudo ist nötig (weiß nicht genau warum, aber ohne funzts nicht) und es ist ja egal, dass root keine Leserechte hat, sudo bedeutet ja "führe aus als Benutzer mit root-rechten" und nicht "führe aus als root", oder? Was mich verwirrt, ist dass es einfach funktioniert wenn ich den Befehl im Terminal eingebe.

4.) Ne, kein cronjob, soll aber einer werden, deswegen brauche ich ja die ssh-Verbindung ohne Passwortabfrage und mit rsa-key.

Bearbeitet von redknight:

Codeblock mit Syntaxhighlighting.

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21818

Wohnort: Lorchhausen im schönen Rheingau

jones79 schrieb:

2.) ist glaub bei einer datei egal, nur wenns

Alle mir bekannten Erklärungen zur Ausgabeumleitung schreiben direkt hintendran, so hab ich mir das auch angewöhnt. Allerdings find ich nun auch andere Beispiele.

3.) sudo ist nötig (weiß nicht genau warum, aber ohne funzts nicht) und es ist ja egal, dass root keine Leserechte hat, sudo bedeutet ja "führe aus als Benutzer mit root-rechten" und nicht "führe aus als root", oder?

Nein. Es heisst "führe als root aus", vgl sudo

$ sudo whoami
root

Was mich verwirrt, ist dass es einfach funktioniert wenn ich den Befehl im Terminal eingebe.

Mit sudo oder ohne?

Über den rest muß ich erst mal meditieren.

jones79

(Themenstarter)

Anmeldungsdatum:
23. Juni 2009

Beiträge: 79

2.) Stimme dir jetzt vollkommen zu ☺

Die direkte Ausführung klappt nur mit sudo.

Die Datensicherung sichert ja mein komplettes System und ich glaub das mit sudo hatte ich so eingerichtet, dass er alle Dateien sichert, auch die, bei denen nur root Leseberechtigung hat.

Wie schon gesagt, ohne sudo bricht er ab. Die Meldung dazu ist

FATAL I/O ERROR: dying to avoid a --delete-during issue with a pre-3.0.7 receiver.
[sender] _exit_cleanup(code=4, file=flist.c, line=1800): about to call exit(4)

Exitcode 4 "...or an option was specified that is supported by the client and not by the server."

Da steht ja auch was dran, pre-3.0.7.reciver...aber als root funktioniert es. Vermutlich ist es weil im Zielverzeichnis System-Dateien gelöscht werden müssen. die im Quellverzeichnis nicht mehr vorhanden sind.

Kann es irgendwas mit dem eingebetteten ssh-Befehl im rsync-Befehl zu tun haben?

Na dann meditier mal und erleuchte mich ☺

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21818

Wohnort: Lorchhausen im schönen Rheingau

Um mal Voodoo zu betreiben (ich rate jetzt nur wild, weil sonst keiner ideen hat), mit dem SSH-Teil in "" gehts auch nicht?

jones79

(Themenstarter)

Anmeldungsdatum:
23. Juni 2009

Beiträge: 79

Also in der Shell klappts sowohl in einfachen als auch in doppelten Anführungszeichen wunderbar.

Im Skript klappts garnicht. Ich hab mal bischen rumprobiert und gelesen, das man manche Zeichen "escapen muss, aber wenn das ein Problem wäre, dann würde ja nicht der Befehl der mittels echo ausgespuckt wird funktionieren und der sieht schon so aus wie es sein soll und funktioniert ja auch.

Kann es irgendwas damit zu tun haben dass die Variable

1
SSHKEY="/home/administrator/.ssh/id_rsa"

eingesetzt wird in

1
OPTIONS="-azvvv --modify-window=2 -e 'ssh -i $SSHKEY' --stats --progress --delete --delete-excluded"

und dadurch irgendeine Formatierung verloren geht?

Jedenfalls funktioniert der ssh-teil

1
ssh -i /home/administrator/.ssh/id_rsa root@DLINK-16G314

in der Shell problemlos. Mit oder ohne sudo ☺

Hat noch jemand eine Idee?

compiopa

Anmeldungsdatum:
18. November 2009

Beiträge: 68

Wohnort: Franken

Hallo jones79,

ich bastle eben auch an so was.

SERVER_IP="192.168.xxx.xxx"
SSHUSER="backupuser"
SSH="/usr/bin/ssh -i /home/backupuser/.ssh/backupuser-rsa-key"

QUELLE="${SSHUSER}@${SERVER_IP}:/datenverzeichnis/"
RSYNC="/usr/bin/rsync -ab --stats -e"
ZIEL="/backupverzeichnis"
LOGDATEI="/verzeichnis/zur/logdatei/logdatei.log"

$RSYNC "${SSH}" ${QUELLE} ${RSYNCZIEL} >> $LOGDATEI 2>&1

Das funktioniert bei mir per script und cron. Wie es mit sudo funktioniert, weiss ich auch noch nicht. Das ist sicher auch wieder tricky. 😊

Wenn Du das hin bekommst, lass es mich wissen, da ich das ja auch brauche. 😀

Gruß compiopa

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21818

Wohnort: Lorchhausen im schönen Rheingau

Ein interessiert mich da noch; Wenn du dir mit

sudo -s

eine rootshell hols und ds script (ohne sudo drin) ausführst, klappt es dann?

jones79

(Themenstarter)

Anmeldungsdatum:
23. Juni 2009

Beiträge: 79

Moin!

So, ich hab noch bischen probiert und folgendes rausgefunden.

Wenn ich als eingeschobenen Befehl nur

1
ssh

verwende, dann funktioniert es mit dem Skript. Das heißt wenn die Key-Datei am Standardort unter ~/ssh/id_rsa ist, dann wird sie automatisch gefunden und benutzt. Ich habe allerdings um eventuelle Problem mit sudo auszuschließen, den Schlüssel auch mit richtigen Rechten im Home-Verzeichnis von root hinterlegt. Das Skript funktioniert aber trotzdem nicht.

Liegt der Schlüssel nicht unter ~/ssh/id_rsa, wie z.b. bei compiopa

1
-i /home/backupuser/.ssh/backupuser-rsa-key

dann würde es bei mir nicht funktionieren. Das kann man einfach probieren in dem man sich mittels

1
ssh username@hostname

auf den Server einwählt.

Ansonsten habe ich das Skript unter /etc/sudoers hinzugefügt, damit es ohne Passwortabfrage ausgeführt werden darf.

1
administrator ALL = NOPASSWD: /home/administrator/Skripte/rsync_backup.sh

Bezogen auf das ursprüngliche Problem bin ich aber immer noch ratlos...

compiopa

Anmeldungsdatum:
18. November 2009

Beiträge: 68

Wohnort: Franken

Hallo jones79,

bei mir klappt es jetzt. 😊

Allerdings betreibe ich, im Gegensatz zu Dir, rsync im "pull modus", während Du es im "push modus" betreibst. Du kannst meine Lösung deshalb nicht 1:1 übernehemen. Aber vieleicht ist sie Dir bei derr lösung Deines Problems etwas behilflich.

Meine Lösung findest Du hier: http://forum.ubuntuusers.de/topic/ssh-server-server-verbindung/2/#post-2672607

Gruß compiopa

Antworten |