sshpass 및 bash 백업 스크립트에서 버그 발견

sshpass 및 bash 백업 스크립트에서 버그 발견

이 스크립트를 사용하여 rsync를 통해 원격 파일을 백업하고 있습니다. 문제는 시작하려고 할 때 발생하며 처리 방법을 알 수 없는 오류가 출력됩니다. 제안해 주시면 감사하겠습니다.

#!/bin/bash
#VARIABLES DEFINE TO STORE COMMANDS AND VALUES.
TODAY_DATE=$(date +%Y%m%d) #Store current date
MKDIR=$(which mkdir)    #store mkdir command
RSYNC=$(which rsync)    #store rsync command
DEL=$(which rm)             #store rm command
TAR=$(which tar)             #store tar command
MAIL=$(which mail)         #store mail command
LOGFILE='/tmp/backup.log' #store path of log file & touch this file in /tmp directory

#ADD EMAIL ID IN MAILTO FOR GETTING NOTIFICATIONS IN MAIL
MAILTO='[email protected]'
BODY="nnFor more information please check $LOGFILE.nnnThanks,n$0"

#CREATE DIRECTORY TO STORE BACKUP FILES
PRODBACKDIR=$TODAY_DATE/var/production-backup/

#IF CONDITION CHECK DIRECTORY IS PRESENT OR NOT AND IF NOT PRESENT CREATE DIRECTORY WITH PROVIDED DIR STRUCTURE.
if [ ! -d "{$PRODBACKDIR}" ] && [ `$MKDIR -p "$PRODBACKDIR"` ];
then
echo -e "Directory Created for site";
fi

#if [ ! -d “{$BLOGBACKDIR}” ] && [ `$MKDIR -p “$BLOGBACKDIR”` ];
#then
#echo -e “Directory Created for Production Blog Codebase”;
#fi

#REMOVE BACKUP FILES 7 DAYS OLDER
find /var/production-backup/ -mtime +7 -exec rm -rf {} ;

#RSYNC COMMAND  TO SYNC CODE OR DATA FROM REMOTE SERVER TO LOCAL USING SSHPASS TO PASS PASSWORD OF REMOTE SERVER
sshpass -p 'password' rsync –progress -rPz -e ssh backups@remotehost:/var/www/website $PRODBACKDIR

#FOR LOOP TO CHECK BACKUP FILES AND COMPRESSED IT WITH .TAR.GZ FILE WHICH SAVES DISK SPACE ON LOCAL SYSTEM AND ALSO REMOVE NON COMPRESSED FILES.
for DOC in $PRODBACKDIR; do
echo "`date '+%Y-%m-%d'` : ${DOC} backup started";
if [ -d ${DOC} ]; then
          FILENAME=$(echo $DOC | awk -F '/' '{print $NF}');
          TARFILE="$FILENAME-$TODAY_DATE.tar.gz";
          echo "`date '+%Y-%m-%d'` : ${DOC} archiving started.";
          $TAR -cvzf $PRODBACKDIR/$TARFILE $PRODBACKDIR/$FILENAME;

#IF CONDITION CHECK ERRORS WHILE CREATING TAR.GZ AND REPORT IF TAR COMMAND FAILS.
if [ $? -eq 0 ]; then
                       echo "`date '+%Y-%m-%d'` : ${DOC} archiving done."
                       $DEL -rf $PRODBACKDIR/$FILENAME
                       echo "`date '+%Y-%m-%d'` : ${DOC} deleting of non-archive directory done."
               else
                       echo "Error while creating tar."
                       echo -e "Error while creating tar file.$BODY" | $MAIL -s 'Error : Creating tar file' $MAILTO
                       exit 1
               fi
       fi
       echo "`date '+%Y-%m-%d %H:%M:%S'` : ${DOC} backup completed"
done


#SEND THE NOTIFICATION EMAIL AFTER SUCCESSFUL COMPLETION OF BACKUP.
echo -e "Backups successfully done for Production codebase" | $MAIL -s "Completed : Backup finished." $MAILTO

실수:

find: missing argument to `-exec'
Try 'find --help' for more information.
Unexpected remote arg: backups@remotehost:/var/www/website
rsync error: syntax or usage error (code 1) at main.c(1361) [sender=3.1.2]
2018-08-02 : 20180802/var/production-backup/ backup started
2018-08-02 : 20180802/var/production-backup/ archiving started.
20180802/var/production-backup/
2018-08-02 : 20180802/var/production-backup/ archiving done.
2018-08-02 : 20180802/var/production-backup/ deleting of non-archive directory d                                                                                                                               one.
2018-08-02 06:58:59 : 20180802/var/production-backup/ backup completed

답변1

;쉘로부터 보호하려면 실행된 명령의 끝 부분을 따옴표 로 묶어야 합니다. 그렇지 않으면 쉘은 이를 명령의 끝으로 처리합니다.find-execfind

변화

find /var/production-backup/ -mtime +7 -exec rm -rf {} ;

도착하다

find /var/production-backup/ -mtime +7 -exec rm -rf {} ';'

또는

find /var/production-backup/ -mtime +7 -exec rm -rf {} \;

아니면 그냥

find /var/production-backup/ -mtime +7 -delete

당신이 find그것을 지원한다면.

또한 명령은 find아래 디렉터리, 파일 또는 기타 콘텐츠를 구별하지 않습니다 /var/production-backup. 예를 들어 /var/production-backup디렉터리 자체가 7일 이상 수정되지 않은 경우(파일이나 디렉터리가 생성/삭제되지 않았기 때문에) 전체 파일 계층이 삭제됩니다.

일반 파일만 삭제하려면 다음을 사용하세요.

find /var/production-backup/ -type f -mtime +7 -delete

관련된:


코드에 대한 추가 참고 사항:

당신이 그렇게한다면

TAR=$(which tar)

그리고 나중에 사용

$TAR ...

아카이브를 생성 tar한 다음 직접 사용할 수도 있습니다 tar. 바이너리 TAR가 직접 사용된 것처럼 검색되므로 바이너리 경로를 설정해도 이점이 없습니다. 변수에 저장된 다른 명령도 마찬가지입니다.tarwhichPATHtar

테스트는 [ `$MKDIR -p "$PRODBACKDIR"` ]반환 상태를 직접 테스트해야 합니다 mkdir. 이 mkdir유틸리티는 테스트용 출력을 생성하지 않습니다. 또한 다음을 사용하기 전에 디렉토리가 존재하는지 테스트할 필요가 없습니다 mkdir -p.

if mkdir -p "$PRODBACKDIR"; then
    echo 'Directory Created for site'
fi

{$PRODBACKDIR}또한 이를 사용하여 디렉토리의 경로 이름을 추가하고 있다는 점에 {유의 하십시오. }쓸모없는 디렉토리 테스트에서 진행되었기 때문에 아무런 피해도 입지 않았습니다(테스트는 항상 실패했습니다). echo -e여기서도 필요하지 않습니다 .

{}변수 확장에서는 변수 이름을 둘러쌀 필요가 없습니다 . 이를 작성해야 하는 유일한 경우 ${variable}는 확장이 문자열의 일부이고 확장 바로 뒤의 문자가 아래와 같이 변수 이름의 유효한 문자인 경우입니다 "${variable}x". 너하다그러나 모든 변수에는 확장을 위해 큰따옴표가 필요합니다.

옵션은 하나 대신 두 개의 대시로 작성됩니다 --progress. rsync또한 -e ssh내가 아는 한 이것은 rsync오랫동안 기본값이었습니다.

FILENAME=$(echo $DOC | awk -F '/' '{print $NF}');

이는 표준 매개변수 대체를 사용하여 다음과 같이 작성할 수 있습니다.

FILENAME=${DOC##*/}

$?예를 들어, 대신에 .

tar ...
if [ $? -eq 0 ]; then ...

하다

if tar ...; then ...

또한 printf변수 데이터를 출력하는 데 사용하는 것도 고려해 보십시오.

TODAY_DATE오늘 날짜를 저장할 문자열을 정의했지만 두 번만 사용했습니다. 그러나 형식이 약간 다른 호출이 적어도 세 개 이상 있습니다 date. ( %Y-%m-%d대체 가능 %F, 참조 man strftime)

;같은 줄의 다른 명령이 바로 뒤에 나오지 않는 명령 끝에 추가할 필요는 없습니다 . 개행 문자는 명령 종결자로 사용됩니다.

등. ,...

또한 기존 백업 소프트웨어를 살펴보는 것이 좋습니다. 예를 borgbackup들어 추천할 수 있습니다 restic.

관련된:

관련 정보