ソースシステム:
- オペレーティングシステム7
- バッシュシェル
- 圧縮
宛先システム:
- FTPサーバー
- セントOS 6.4
- バッシュシェル
- 解凍する
シェルスクリプトを使用してファイルをアーカイブして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