
Исходная система:
- CentOS7
- оболочка bash
- почтовый индекс
Система назначения:
- FTP-сервер
- CentOS 6.4
- оболочка bash
- распаковать
Я написал скрипт для архивации файла и отправки его на FTP-сервер с помощью скрипта оболочки
#!/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 {} \;
Теперь проблема в том, что сжатый файл в целевой системе не извлекается с помощью unzip
команды и выдает следующую ошибку:
Архив: 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)
Я использовал tar
архив, но безуспешно. Он не извлекает файл в целевой системе и показывает следующую ошибку
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
Как решить эту проблему?
решение1
Вероятно, у вас уже есть сообщения об ошибках, которые вы просто не видите при запуске этого скрипта.
Запишите все выходные данные в журнал, выполнив его с помощью
script.sh > log.txt 2>&1
Последняя часть перенаправляет stderr в stdout, в данном случае log.txt
Вероятно, вы обнаружите, что истекло время ожидания (сколько файлов вы отправляете, насколько стабильно ваше соединение) или, может быть, команда, которая, как вы думаете, ждет следующей команды, на самом деле не ждет в скрипте.
решение2
Ваш скрипт должен установить binary
(после quote
команд). В противном случае он будет использовать текстовый режим для этого скрипта.
Если бы он был интерактивным, ftp-клиент, который я только что протестировал, принял бы бинарный режим. Но не тогда, когда он неинтерактивен.
Вот что я проверил/и исправил:
#!/bin/sh
ftp -in invisible-island.net <<EOF
quote USER anonymous
quote PASS anonymous
binary
cd cproto
get cproto.tar.gz
bye
EOF