이 셸 스크립트는 bash에서는 실패하지만 명령은 SSH에서 작동하는 이유는 무엇입니까?

이 셸 스크립트는 bash에서는 실패하지만 명령은 SSH에서 작동하는 이유는 무엇입니까?

내가 작성하려고 하는 것은 웹 사이트와 이를 지원하는 모든 MySQL DB를 백업하는 쉘 스크립트입니다. 인터넷 전체에서 예제를 찾았지만 감옥에 갇힌 SSH 세션의 bash에서 스크립트를 실행하면 실패합니다. SSH 세션에 직접 명령을 입력하면 제대로 작동합니다.

#!/bin/sh

DB1="first_db"
THEDATE=$(date +"%Y-%m-%d")
THEUSER=user
THEDBPW=password

mysqldump -u $THEDBUSER -p$THEDBPW $DB1 > dbbackup_$DB1_$THEDATE.sql

tar -czf sitebackup_website_$THEDATE.tar /home/website/public_html
gzip sitebackup_website_$THEDATE.tar

이 스크립트는 웹 서버에 상주하므로 테스트 목적으로 SSH를 통해 서버 cd와 디렉토리에 연결하고 bash backup.sh. mysqldump연결되지 않고 비밀번호를 전달하지 못한 것 같습니다('비밀번호 사용: NO'를 보고하는 오류를 반환함). 그런 다음 tar 명령이 실패하고 /home/website/public_html'해당 파일이나 디렉터리가 없습니다'라고 표시할 수 없다고 보고합니다. tar그런 다음 이전 오류로 인해 오류 상태로 종료되고 있음을 보고합니다.

내가 여기서 무엇을 놓치고 있는 걸까요?

답변1

서버에 로그인하고 다음을 실행하여 Windows 줄 끝 스크립트를 확인하세요.

cat -v /path/to/script

줄이 로 끝나면 ^M문제가 됩니다.

다음을 실행하여 줄 끝이 끊어진 파일을 수정할 수 있습니다.

dos2unix /path/to/script

dos2unix가 서버에 없으면 대신 다음과 같이 sed를 사용할 수 있습니다.

sed -i 's/\r$//' /path/to/script

답변2

사용자 이름을 변수에 할당했지만 THEUSER명령 mysqldump에서는 변수를 사용하고 있습니다 THEDBUSER.

답변3

tardir=$PWD ; cd /home/website/public_html && 
    tar -czf "$tardir"/sitebackup_complete-office_"$THEDATE.tar"

아니면 그냥:

tar -C/home/website/public_html -czf \
    sitebackup_complete-office_"$THEDATE.tar"

일반적으로 많은 사람들이 tars절대 경로를 사용하지 않는 한 전혀 작동하지 않습니다.명시적으로 지시함그렇게 하려면.

기본적으로 GNU tar는 입력이나 출력에서 ​​선행 문자를 삭제 /하고 구성 요소가 포함된 파일 이름에 대해 불평합니다 ... 이 옵션은 이 동작을 끕니다.

ssh's명령 전달 및 인용에 따라 명령이 미리 경로를 확인하는 것이 전적으로 가능합니다 . 경로 이름에서 변수를 확장하는 경우에도 마찬가지입니다.

답변4

문제에 대한 설명을 올바르게 이해했다면 주요 차이점은 다음과 같습니다.투옥되다SSH 세션 - 감옥에 갇힌 세션 내에서 실행되는 프로세스는 감옥 디렉터리(종종 홈) 외부를 볼 수 없습니다. 그렇기 때문에 투옥되지 않은 세션에서는 문제가 발생하지 않습니다. Yo, 다음 내용도 확인해 보세요.위키피디아 감옥 입장상세 사항은.

관련 정보