"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)

관련 정보