cron이 실행하는 스크립트에서 gpg를 실행하는 방법은 무엇입니까?
문제
다음과 같은 부분이 있는 스크립트가 있습니다.
for file in `ls *.tar.gz`; do
echo encrypting $file
gpg --passphrase-file /home/$USER/.gnupg/backup-passphrase \
--simple-sk-checksum -c $file
done
어떤 이유로 이 스크립트를 수동으로 실행하면 완벽하게 작동하고 모든 파일이 암호화됩니다.이것을 cron 작업으로 실행하면 echo $file
잘 작동하지만(로그에 "<파일> 암호화 중"이 표시됨) 파일이 암호화되지 않고 stdout/stderr 출력 없이 gpg 자동 실패가 발생합니다.
어떤 단서가 있나요?
해결책
생각보다 답은 쉬웠던 것 같다.이있다 --batch
매개변수가 누락되어 gpg는 cron 작업에 존재하지 않는 /dev/tty에서 읽으려고 시도합니다.내가 사용한 것을 디버깅하려면 --exit-on-status-write-error
매개변수.하지만 이를 사용하려면 종료 상태 2에서 영감을 받아 에코로 보고했습니다. $?
CD-Man이 제안한대로.
다른 팁
내 경우 gpg는 키를 사용하기 위한 홈 디렉토리를 찾을 수 없습니다.
GPG:기본 비밀 키가 없습니다:비밀키 없음
GPG:0003608.cmd:서명+암호화 실패:비밀키 없음
그래서 나는 추가했다 --homedir /root/.gnupg
.최종 명령은 다음과 같습니다.
echo 'password'| gpg -vvv ---homedir /root/.gnupg --batch ---passphrase-fd 0- output /usr/share/file.gpg-encrypt--sign /usr/share/file.tar.bz2
cronjob이 실행 중일 때 GPG가 경로에 있는지 확인해야 합니다.가장 좋은 추측은 GPG의 전체 경로를 얻는 것입니다. which gpg
) 전체 경로를 사용하여 실행합니다(예: /usr/bin/gpp...
).
기타 디버깅 팁:
- 의 값을 출력하다
$?
GPG를 실행한 후(예:에코 "$?").성공하면 종료 코드가 0이 되어야 합니다. - STDERR을 GPG용 STDOUT으로 리디렉션한 다음 STDOUT을 파일로 리디렉션하여 인쇄될 수 있는 오류 메시지를 검사합니다(명령줄에서 이 작업을 수행할 수 있음).
/usr/bin/gpg ... 2>&1 >> gpg.log
)
cron 작업을 실행하는 사용자에게 파일을 암호화하는 데 필요한 권한이 있는지 확인하십시오.
나는이 문제를 한 번 겪었습니다.
이유를 실제로 말할 수는 없지만 cron이 사용자와 동일한 환경 변수를 사용하여 실행된다고 생각하지 않습니다.
실제로 프로그램이 제대로 실행되려면 좋은 경로를 내보내야 했습니다.gpg가 적어도 실행을 시도하고 있습니까?
아니면 cron이 실행될 때 실제로 현재 디렉터리에 암호화하려는 파일이 있습니까?
아마도 echo whereis gpg
그리고 echo $PATH
스크립트에 포함되어 있는지 확인하십시오 ...나를 위해 일했습니다.
@skinp Cron 작업은 sh에 의해 실행되는 반면, 대부분의 최신 Unix는 대화형 로그인에 bash 또는 ksh를 사용합니다.내 경험상 가장 큰 문제는 sh가 다음과 같은 것을 이해하지 못한다는 것입니다.
export PS1='\u@\h:\w> '
다음과 같이 변경해야 합니다.
PS1='\u@\h:\w> '
export PS1
따라서 cron이 첫 번째 구문을 사용하여 환경 변수를 정의하는 쉘 스크립트를 실행하는 경우 다른 명령을 실행하기 전에 sh가 변수 정의를 시도하기 때문에 다른 명령은 실행되지 않습니다.
나의 경우에는:"gpg:암호 해독 실패:세션 키가 잘못되었습니다."
/usr/bin/gpg 추가, 버전 확인, --batch 설정, --home 설정(/root/.gnupg 및 /home/user/.gnupg 사용)을 시도했지만 모두 작동하지 않았습니다.
/usr/bin/gpg -d --batch --homedir /home/ec2-user/.gnupg --no-mdc-warning -quiet --passphrase "$GPG_PP" "$file"
AWS beanstalk 인스턴스의 cron에는 --passphrase $GPG_PP를 설정하는 데 사용되는 환경 변수가 필요하다는 것이 밝혀졌습니다.현재 크론:
0 15 * * * $(source /opt/elasticbeanstalk/support/envvars && /home/ec2-user/bin/script.sh >> /home/ec2-user/logs/cron_out.log 2>&1)