Warum schlägt dieses Shell-Skript in Bash fehl, aber die Befehle funktionieren in SSH?

Warum schlägt dieses Shell-Skript in Bash fehl, aber die Befehle funktionieren in SSH?

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 cdim Verzeichnis an und führe aus bash backup.sh. mysqldumpstellt 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_htmlmit „no such file or directory“ starten kann. tarDann 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 mysqldumpBefehl 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 tarsfunktionieren 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'sBefehle 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.

verwandte Informationen