Probleme mit Script (Linux)

#1960456
Lesenswert?

Servus allerseits

Seit Jahr und Tag wird auf einem Linux Server um 22 Uhr ein Backup 
gemacht und anschliessend diese Daten auf einen externen Server kopiert.
Seit Tagen versuche ich nun diese Daten zuerst mit ccrypt zu 
verschlüsseln und erst dann zu kopieren.
Wenn ich die Script-Datei vom shell aus aufrufe, klappt es.
Wenn's aber cron macht, gibts ein Mischmasch, bei dem ich keine 
Regelmaessigkeit festellen konnte.

Dem Script hatte ich nur die Funktion  copy_and_encrypt hinzugefügt. 
Diese Funktion kopiert den soeben neu erstellen Backup-Order in einen 
temporaeren Ordner, wo es dann verschlüsselt wird.
Kopieren klappt immer. Aber im temporaeren Ordern werden (falls es cron 
macht) nicht alle Dateien verschlüsselt, sonder nur zufaellig 
irgendwelche. Mehrheitlich wird nicht verschlüsselt.
1
#============================
2
# copy_and_encrypt
3
#============================
4
copy_and_encrypt()
5
{
6
  # copy
7
  #-----
8
  cd $myFileSystem/$myDate
9
  find . -depth -print | cpio -pd /home/tmp_backup/$myDate
10

11
  # encrypt
12
  #--------
13
  passwort="irgendeinpasswort"
14
  cd /home/tmp_backup/$myDate
15
  for file in `find /home/tmp_backup/$myDate -type 'f'`;
16
  do
17
    ccrypt -ev -K $passwort $file
18
  done
19
}

Weiss jemand Rat?
Gast #1960526
Lesenswert?

PS, ich würde das Password anders angeben. So nähmlich bekommt jeder das 
Password mit, welcher ein ps ausführen kann, oder auch das Proc 
implementiert ist. Besser ist, das password aus einem File lesen, dann
ist nur ein `cat crypt.pwd` ersichtlich.
Gast #1960589
Lesenswert?

Sämtliche Leer- und Sonderzeichen-Probleme kann man lösen, indem man die 
for-Schleife komplett ersetzt durch:
1
    find /home/tmp_backup/$myDate -type 'f' -print0 |xargs -0r ccrypt -K $passwort

Das geht auch eine Idee schneller, weil ccrypt weniger oft gestartet 
wird.

Dazu ist chris Empfehlung, das Passwort nicht auf der Commandline 
anzugeben, wirklich sinnvoll zumal ccrypt ja mit "-k" eine gute 
Möglichkeit dafür anbietet.

Zu den eigentlichen Problemen:

Wenn cron und ein manueller Aufruf unterschiedliche Dinge tun, hat das 
typischerweise folgende Gründe:

 - andere Umgebungsvariablen, insbesondere PATH und LD_LIBRARY_PATH,
 - anderer Umgang mit Standard-Eingabe bzw. -Ausgabe,
 - andere Berechtigungen / Benutzer.

Das Einfache zuerst:

 - Der Cron-Job läuft unter root-Rechten oder mit einem anderen techn. 
Benutzer?

Zu den Umgebungsvariablen:

 - Die "zufällig verschlüsselten Dateien" sind nicht zufällig die, die 
schon vorher verschlüsselt waren?
 - Ist ccrypt im Standardpfad, also in /bin oder /usr/bin ?
 - Wenn es daran nicht liegt, füg doch bitte mal sowas in dein Script 
ein:
1
    logfile=/tmp/x-debug-$myDate.log
2
    declare -p > $logfile

Die unterschiedlichen Ausgaben in den Dateien helfen dabei, 
einzugrenzen, welche Unterschiede in den beiden Aufrufszenarien 
existieren. Insbesondere lassen sich interaktiv die Werte vom cron-Lauf 
nach und nach setzen bzw. mit "unset VARNAME" löschen. Nach jeder 
Änderung nachmal probieren. Wenn es dann auf einmal nicht mehr geht, war 
es die letzte Änderung :-)

Zu STDIN/STDOUT:

Wenn es daran hakt, wird es gruselig, das überhaupt herauszufinden bzw. 
zu beheben. Probier erstmal das andere.
#1961915
Lesenswert?

Nochmals Dank für all die Hinweise. Leider komme ich nur step by step 
dazu, Eure Vorschlaege in die Tat umzusetzen, da ich mit incremental 
backup arbeite und deshalb nur einmal pro Tag die Script starten möchte.

Also um ein Problem mit Leerzeichen handelt es sich nicht. Sowohl 
Dateien mit als auch Dateien ohne Leerzeichen im Namen wurden von ccrypt 
(gestartet von cron mit root Berechtigung) verschlüsselt.

Als naechstes habe ich den Vorschlag von Herrn Wachtler aufgegriffen und 
die Zeile mit den Ausdruch $file im Befehl ccrypt -ev -K $passwort $file 
in Ausführungszeichen gesetzt:
1
ccrypt -ev -K $passwort "$file"

Hat aber auch nichts gebracht. Den naechsten Versuch mache ich morgen.
Ich habe noch ein Bild angehaengt. Vielleicht sieht einer von Euch ein 
Muster, wieso ccrypt manche Dateien verschlüsselt und manche nicht.

Mit freundlichen Grüssen aus Istanbul (21 Grad)
Angehängte Dateien:
#1961930
Lesenswert?

Mehmet Kendi schrieb:
> (21 Grad)

Das ist mies!
Du solltest hier Schnee schippen, anstatt von 21° zu erzählen! :-)

Aber wenn du sowieso änderst, könntest du vor der Schleife noch
ein:
  rm /tmp/backup_tmp.log
einbauen und in der Schleife vor dem ccrypt noch eine Zeile:
  echo "verschlüsseln von ["$file"]" >>/tmp/backup_tmp.log

Dann würde man hinterher sehen, welche Dateien er versucht zu 
verschlüsseln.
#1962087
Lesenswert?

Noch eine Idee:
Da tauchen eher etwas, naja, schrullige Dateinamen auf (nicht böse
nehmen).
Wenn du ohnhehin schon wie von mir vorgeschlagen eine kleine
Logdatei erzeugst, könnte man auch gleich dort die
Environmentvariablen mit ausgeben, also z.B.:
  rm /tmp/backup_tmp.log
  set >/tmp/backup_tmp.log

Weiterhin in der Schleife auch gleich die Ausgabe des ccrypt mit
ablegen:
 for...
  echo "verschlüsseln von ["$file"]" >>/tmp/backup_tmp.log
  ccrypt -ev -K $passwort $file >> /tmp/backup_tmp.log 2>&1

Die Ausgabe von dem set könnte man dann mal vergleichen
mit der entsprechenden Ausgabe einer normalen Sitzung.
Beim Initialisieren einer Shell wird ja zwischen einer
Login-Sitzung und einem nicht-Login unterschieden.
Vielleicht wirkt sich das (je nach init-Dateien
~/.bashrc, ~/.profile, /etc/bashrc, /etc/profile etc.)
auf Variablen wie LANG aus.

Das wiederum kann man auch mit einem kleinen Skript
testen, das als cron-Job eingetragen wird unabhängig
von der Datensicherung. Dann musst du nicht jeweils eine
Nacht auf einen Test warten...
#1963152
Lesenswert?

Nein, Zufall ist es bestimmt nicht. Seit sicher etwas mehr als 2 Wochen 
hat die Script nur fehlerhaft die Verschluesselung bearbeitet.

Ich habe, weil so paff, die Script soeben nochmals gestartet. Funzt 
problemlos, hat wieder alles verschluesselt.

Ich verstehe das nicht.
#1963161
Lesenswert?

:D neee, so einfach mache ich mir das Leben nicht! Ich muss schon 
wissen, wieso es jetzt klappt und vorher es nicht geklappt hat.

Die Temperatur ist übrigens auf 12 Grad runter. Aber bitte keine 
Schadenfreude aufkommen lassen. Ab Dienstag geht's wieder obsi und am 
Donnerstag sollten wir gemaess Wetterdienst wieder bei 20 Grad 
angekommen sein.
Persönlich waeren mir aber Minustemperaturen und Schnee lieber.

MfG aus Istanbul
Gast #1963234
Lesenswert?

In der Datei stehen aber nur die Ausgaben von echo, die Ausgaben von 
ccrypt fehlen. Da ja "ccrypt -ev" verwendet wurde, müsste noch jeweils 
mindestens eine weitere Zeile vorhanden sein.

Sollte also ccrypt irgendwelche Probleme haben, so wüssten wir nichts 
davon.

Ach ja: "ccrypt -ev" sollte doch eigentlich schon vor der Änderung 
Ausgaben erzeugen. Diese sollte cron dann eigentlich per Mail zustellen. 
Wo sind diese Logs? Steht da was Auffälliges drin?
#1963561
Lesenswert?

Läubi .. schrieb:
> Interessehalber kannst du ja die Zeile wieder auf "orginal" ändern und
> dann schauen ob der Fehler wieder auftritt.

Okay, werde es für heute abend wieder aendern.

Rolf Magnus schrieb:
> Hast du den entfernt?
Nöö, wieso soll ich mir eine Mehrarbeit machen? Wie ich soeben sehe, 
werden auch die Systemlogs von cron nicht nachgeführt.
Ziemlich ein altes System (Ubuntu 7.04). Kann also auch sein, dass ich 
der Schuldige war und mich jetzt nicht daran erinnere.
#1963586
Lesenswert?

Habe es nicht abwarten können und einen neuen cron-Eintrag eingetragen.
Es scheint, dass die Vermutung von Herrn Läubi

Läubi .. schrieb:
> Also ich hatte auch shconmal das Phänomen, dass wenn ich die
> Standard/Error Ausgabe nicht lese das Programm seinen regulären Dienst
> verweigert...

die Erklaerung für dieses Phaenomen zu sein scheint.
Nochmals ein herzliches Dankeschön für all die Hilfe.
Gast #1964036
Lesenswert?

In dem Fall bietet sich an, für das gesamte cron-Script klare 
Verhältnisse zu schaffen und alle Ein- und Ausgabeströme zu schließen 
bzw. in ein Logfile umzuleiten.

Am einfachsten geht das, indem man folgende Zeile ganz am Anfang des 
cron-Scripts einfügt:

    exec < /dev/null >> /var/log/backup.log 2>&1

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren