「tar: メンバー名から先行する '/' を削除」というメッセージを含むメール通知

「tar: メンバー名から先行する '/' を削除」というメッセージを含むメール通知

次のスクリプトがあります

#!/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警告の問題を解決し、重要なエラーメッセージを引き続き表示できます。変数はアーカイブの内容を正しく反映するため、スクリプトの一貫性がさらに向上します。

  1. ソースディレクトリ名から先行する "/"文字をすべて削除します。

    SRCDIR1="usr/local/bin/"                   
    SRCDIR2="etc/openvpn/"
    SRCDIR3="var/script/"
    
  2. -C /オプションの使用tartarアーカイブのディレクトリ変更を行う前に/。このオプションが利用できない場合は、コマンドを/実行する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)

関連情報