Quellsystem:
- CentOS 7
- Bash-Shell
- Reißverschluss
Zielsystem:
- FTP-Server
- CentOS 6.4
- Bash-Shell
- entpacken
Ich habe ein Skript geschrieben, um die Datei zu archivieren und sie mithilfe eines Shell-Skripts an den FTP-Server zu senden
#!/bin/bash
# Declare no. of days
days=15
# Declare Source path of sql files and Destination path of backup directory
dumps=/home/applications/backup
bkpdir=/home/applications/backup/olddumps
# Find sql dumps of ets
files=($(find $dumps/*.sql -mtime +"$days"))
for file in ${files[*]}
do
# Move each file into backup dir which is 15 days old
echo "file is: $file\n";
mv $file $bkpdir
# Find the sql files and compress them
cd $bkpdir
filename=$(basename $file)
zip $bkpdir/$filename.zip $filename
# FTP Login
HOST=a.b.c.d
USER=xxxx
PASS=yyyyy
REM_DIR=/olddumps/sqlfiles
echo "Uploading file via FTP:"
ftp -in $HOST <<EOF
quote USER $USER
quote PASS $PASS
cd $REM_DIR
put $filename.zip
bye
EOF
# Remove sql files if any
rm $bkpdir/$filename
done
# Remove compressed files which are 6 months old
find $bkpdir/*.zip -type f -mtime +180 -exec rm {} \;
Das Problem besteht nun darin, dass die komprimierte Datei im Zielsystem mit unzip
dem Befehl nicht extrahiert wird und den folgenden Fehler anzeigt:
Archiv: emt_bus-08-09-16-03-29.sql.zip
caution: zipfile comment truncated
error [emt_bus-08-09-16-03-29.sql.zip]: missing 49666528 bytes in zipfile
(attempting to process anyway)
error [emt_bus-08-09-16-03-29.sql.zip]: start of central directory not found;
zipfile corrupt.
(please check that you have transferred or created the zipfile in the
appropriate BINARY mode and that you have compiled UnZip properly)
Ich habe tar
archiviert, aber kein Glück. Es extrahiert die Datei nicht im Zielsystem und zeigt den folgenden Fehler an
gzip: stdin: invalid compressed data--format violated
emt_bus-08-09-16-03-29.sql
tar: Unexpected EOF in archive
tar: Unexpected EOF in archive
tar: Error is not recoverable: exiting now
Wie kann das Problem behoben werden?
Antwort1
Wahrscheinlich werden Ihnen beim Ausführen des Skripts bereits Fehlermeldungen angezeigt, die Sie jedoch nicht sehen.
Erfassen Sie die gesamte Ausgabe in einem Protokoll, indem Sie es mit
script.sh > log.txt 2>&1 ausführen.
Der letzte Teil leitet stderr auf stdout um, in diesem Fall log.txt
Sie werden wahrscheinlich feststellen, dass es eine Zeitüberschreitung gibt (wie viele Dateien senden Sie, wie stabil ist Ihre Verbindung) oder dass ein Befehl im Skript tatsächlich nicht wartet, obwohl Sie meinen, er warte auf den nächsten Befehl.
Antwort2
Ihr Skript sollte binary
(nach den quote
Befehlen) festlegen. Andernfalls wird für dieses Skript der Textmodus verwendet.
Wenn es interaktiv wäre, würde der FTP-Client, den ich gerade getestet habe, in den Binärmodus wechseln. Aber nicht, wenn er nicht interaktiv ist.
Folgendes habe ich getestet und behoben:
#!/bin/sh
ftp -in invisible-island.net <<EOF
quote USER anonymous
quote PASS anonymous
binary
cd cproto
get cproto.tar.gz
bye
EOF