Ich versuche, ein Shell-Skript zu schreiben, das eine Website und alle MySQL-Datenbanken, die sie unterstützen, sichert. Ich habe im ganzen Netz Beispiele dafür gefunden, aber wenn ich das Skript in Bash in einer blockierten SSH-Sitzung ausführe, schlägt es fehl. Wenn ich die Befehle direkt in die SSH-Sitzung eingebe, funktionieren sie einwandfrei.
#!/bin/sh
DB1="first_db"
THEDATE=$(date +"%Y-%m-%d")
THEUSER=user
THEDBPW=password
mysqldump -u $THEDBUSER -p$THEDBPW $DB1 > dbbackup_$DB1_$THEDATE.sql
tar -czf sitebackup_website_$THEDATE.tar /home/website/public_html
gzip sitebackup_website_$THEDATE.tar
Dieses Skript befindet sich auf dem Webserver. Zu Testzwecken melde ich mich per SSH beim Server und cd
im Verzeichnis an und führe aus bash backup.sh
. mysqldump
stellt keine Verbindung her und scheint das Passwort nicht zu übergeben (es gibt die Fehlermeldung „using password: NO“ zurück). Dann schlägt der Tar-Befehl fehl und meldet, dass er nicht /home/website/public_html
mit „no such file or directory“ starten kann. tar
Dann meldet er, dass er aufgrund vorheriger Fehler mit einem Fehlerstatus beendet wird.
Was übersehe ich hier?
Antwort1
Überprüfen Sie das Skript auf Windows-Zeilenenden, indem Sie sich am Server anmelden und ausführen
cat -v /path/to/script
Wenn die Zeile mit endet ^M
, liegt das das Problem.
Sie können eine Datei mit unterbrochenen Zeilenenden reparieren, indem Sie
dos2unix /path/to/script
Wenn dos2unix auf dem Server nicht vorhanden ist, können Sie stattdessen sed wie folgt verwenden:
sed -i 's/\r$//' /path/to/script
Antwort2
Sie haben der Variable den Benutzernamen zugewiesen THEUSER
, aber Ihr mysqldump
Befehl verwendet die Variable THEDBUSER
.
Antwort3
tardir=$PWD ; cd /home/website/public_html &&
tar -czf "$tardir"/sitebackup_complete-office_"$THEDATE.tar"
oder nur:
tar -C/home/website/public_html -czf \
sitebackup_complete-office_"$THEDATE.tar"
Im Allgemeinen tars
funktionieren viele überhaupt nicht mit absoluten Pfaden, es sei denn,ausdrücklich angewiesenum dies zu tun.
Standardmäßig lässt GNU Tar führende Zeichen
/
bei der Eingabe oder Ausgabe weg und beschwert sich über Dateinamen, die eine..
Komponente enthalten. Diese Option schaltet dieses Verhalten ab.
Es ist durchaus möglich, dass ssh's
Befehle Pfade im Voraus auflösen, je nach Befehlsübermittlung und Anführungszeichen. Dasselbe gilt für die Erweiterung der Variablen in Ihren Pfadnamen.
Antwort4
Wenn ich Ihre Problembeschreibung richtig verstehe, scheint der Hauptunterschied darin zu liegen,inhaftiertSSH-Sitzung - Prozesse, die innerhalb der Jailed-Sitzung laufen, können nicht außerhalb ihres Jail-Verzeichnisses (oft ihr Home) sehen. Deshalb treten in nicht-Jailed-Sitzungen keine Probleme auf. Sie können sich auch dieWikipedia Gefängniseintragfür mehr Details.