
次のスクリプトがあります
#!/bin/bash
#Purpose = Backup
#Created on 15-10-2015
#START
#cp -b /etc/rc.local $DESDIR$MKDIRNAME/rc.local
TIME=`date +"%d%b%y_%H%M%S"`
MKDIRNAME=`date +"%d%b%y"`
FOBACKUP=$(date +'%d%b%y' -d 'last month')
DESDIR="/usr/local/backup/"
FILENAME1="filebin_$TIME.tar.gz"
FILENAME2="openvpn_$TIME.tar.gz"
FILENAME3="script_$TIME.tar.gz"
SRCDIR1="/usr/local/bin/"
SRCDIR2="/etc/openvpn/"
SRCDIR3="/var/script/"
mkdir -m 0755 $DESDIR$MKDIRNAME
tar -cpzf $DESDIR$MKDIRNAME/$FILENAME1 $SRCDIR1
tar -cpzf $DESDIR$MKDIRNAME/$FILENAME2 $SRCDIR2
tar -cpzf $DESDIR$MKDIRNAME/$FILENAME3 $SRCDIR3
cp -b /etc/rc.local $DESDIR$MKDIRNAME/rc.local
cp -b /etc/crontab $DESDIR$MKDIRNAME/crontab
if [ -d "$DESDIR$FOBACKUP" ]; then
echo "file $FOBACKUP exist and was deleted!"
rm -rf $DESDIR$FOBACKUP
fi
#END
ただし、cronでこのスクリプトを実行した後、毎日次のメッセージでメールを受け取ります。
tar: Removing leading `/' from member names
この警告を受けないようにこのスクリプトを変更するにはどうすればよいですか?
答え1
tar
セキュリティ上の理由から、この警告が表示され、先行スラッシュが削除されます。ルート権限がなくても絶対パスを含むアーカイブを抽出すると、現在のファイルを古いファイルで上書きする意図しない結果が生じる可能性があります。
次の手順を実行すると、不要な出力を削除し、tar
警告の問題を解決し、重要なエラーメッセージを引き続き表示できます。変数はアーカイブの内容を正しく反映するため、スクリプトの一貫性がさらに向上します。
ソースディレクトリ名から先行する "/"文字をすべて削除します。。
SRCDIR1="usr/local/bin/" SRCDIR2="etc/openvpn/" SRCDIR3="var/script/"
-C /
オプションの使用tar
tar
アーカイブのディレクトリ変更を行う前に/
。このオプションが利用できない場合は、コマンドを/
実行するtar
前にディレクトリを変更する必要があります。tar -C / -cpzf $DESDIR$MKDIRNAME/$FILENAME1 $SRCDIR1 tar -C / -cpzf $DESDIR$MKDIRNAME/$FILENAME2 $SRCDIR2 tar -C / -cpzf $DESDIR$MKDIRNAME/$FILENAME3 $SRCDIR3
答え2
調査パイプリダイレクト間の違い標準入力、標準出力、標準エラー。
この問題は以下で説明します。
tar -cpzf $DESDIR$MKDIRNAME/$FILENAME1 $SRCDIR1 2> /dev/null
編集: '2> / dev / nullを使用してstderrを/ dev / nullにリダイレクトするための「セキュリティ」の問題により、「-C /」オプションを使用せずに「安全に」実行できる他の可能な方法があります。 tar 操作を実行するには、まず fs から「/」に移動します。 IMHO これは、「/」からアーカイブを抽出するのと同じように、現在のファイルシステムをアーカイブの内容で上書きするため、セキュリティ上の問題です。
いくつかの選択肢:
RobertLが提案した代替(最初に$ SRCDIRに移動)
%> tar -cpzf -C $SRCDIR1 $DESDIR$MKDIRNAME/$FILENAME1 $SRCDIR1
stderrのリダイレクトを使用してstdoutをキャプチャしますが、まだ次のようにエラーを確認します。$?
%> output=$((tar -cpzf $DESDIR$MKDIRNAME/$FILENAME1 $SRCDIR1) 2> /dev/null)
%> [ $? -ne 0 ] && echo "An error occurred with tar"
%> echo $output
または、常に相対パスおよび/または絶対パスを使用できます(manを参照pwd
)。
%> $((tar -cpzf $DESDIR$MKDIRNAME/$FILENAME1 $(pwd)/$SRCDIR1) 2&>1)