다음 스크립트가 있습니다
#!/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)