cron이 실행하는 스크립트에서 gpg를 실행하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/39867

  •  09-06-2019
  •  | 
  •  

문제

다음과 같은 부분이 있는 스크립트가 있습니다.

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)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top