exec cp는 스크립트 내에서는 실패하지만 직접 실행하면 작동합니다.

exec cp는 스크립트 내에서는 실패하지만 직접 실행하면 작동합니다.

SQL 백업을 Windows 서버에 복사하는 스크립트가 있습니다. 이것은 /etc/fstab의 줄입니다:

//my.win.box/share$ /winshare   cifs    credentials=/etc/credfile,dom=mydomain,uid=0,gid=0,file_mode=0600,dir_mode=0700 0 0

백업 스크립트는 다음과 같습니다.

백업.sh:

# copy zipped sql exports to /winshare/db
find /backups/sql/*sql.gz -mtime +1 -exec cp {} /winshare/db \;

루트 권한으로 로그인합니다(이 경우 루트).

$ ./backup.sh
cp: cannot create regular file `/winshare/db/mydb_20130301.sql.gz': Permission denied

그러나 스크립트를 통하지 않고 프롬프트에서 명령을 실행하는 경우:

$ find /backups/sql/*sql.gz -mtime +1 -exec cp {} /winshare/db \;

파일이 예상대로 복사됩니다. 루트로 다시 로그인하십시오.

스크립트 내의 명령이 실패하지만 콘솔에서는 동일한 명령이 작동하는 원인은 무엇입니까?

답변1

당신은 이것이 어떤 유형의 기계인지 말하지 않았지만 제가 처음 관찰한 바는 당신의 backup.sh에 그것을 실행해야 하는 프로그램을 지정하는 인터프리터 줄이 없다는 것입니다. 당신은 다음과 같은 것을 원합니다 :

#!/bin/bash
export PATH=/bin:/usr/bin

find....your stuff..here

이제 이것만으로는 권한 문제가 해결되지는 않지만 도움이 될 것입니다. 쉘이 다른 find 명령을 지정하는 시스템 전체 .rc 파일을 가져오거나 그 기능을 아는 사람이 있을 수 있습니다. 인터프리터를 지정하면 해당 인터프리터에 대한 초기화 파일을 볼 수 있습니다. 또한 로그인 환경에는 스크립트와 다른 상황이 있을 수 있습니다.

관련 정보