Pergunta

Eu tenho um script que tem uma parte que se parece com isso:

for file in `ls *.tar.gz`; do
  echo encrypting $file
  gpg --passphrase-file /home/$USER/.gnupg/backup-passphrase \
    --simple-sk-checksum -c  $file
done

Por algum motivo, se eu executar este script manualmente, funciona perfeitamente, e todos os arquivos são criptografados.Se eu executar isto como um trabalho do cron, echo $file funciona bem (eu ver "com criptografia <file>"no log), mas o arquivo não fica criptografado e gpg silêncio falha com nenhuma stdout/saída stderr.

Algum palpite?

Foi útil?

Solução

Acontece que a resposta foi mais fácil do que eu esperava.Há um --batch parâmetro em falta, gpg tentar ler a partir de /dev/tty que não existe para os trabalhos do cron.Para debug que eu tenho usado --exit-on-status-write-error param.Mas para o uso que eu estava inspirado por status de saída de 2, relatado pelo ecoando $? como Cd-Homem sugeriu.

Outras dicas

No meu caso gpg não pode encontrar o diretório home para o uso de teclas:

gpg:sem padrão de chave secreta:Não é segredo chave

gpg:0003608.cmd:sinal de+criptografar falha:Não é segredo chave

Então eu adicionei --homedir /root/.gnupg.O comando final pode parece

echo "senha" | gpg -vvv --homedir /root/.gnupg --lote --senha-fd 0 --output /usr/share/arquivo.gpg --sign-sign /usr/share/arquivo.alcatrão.bz2

Você deve certificar-se que o GPG está em seu caminho quando o cron está em execução.O seu melhor palpite seria fazer o caminho completo do GPG (fazendo which gpg) e executá-lo usando o caminho completo (por exemplo, /usr/bin/gpp...).

Algumas outras dicas de depuração:

  • de saída o valor de $? depois de executar o comando GPG (como este:echo "$?").Isso dá a você o código de saída, que deve ser 0, se ele conseguiu
  • redirecionar a STDERR para o STDOUT para o GPG e, em seguida, redireciona STDOUT para um arquivo, para inspecionar quaisquer mensagens de erro que possam ficar impresso (você pode fazer isso de uma linha de comandos: /usr/bin/gpg ... 2>&1 >> gpg.log)

certifique-se de que o utilizador que está a executar o job cron tem as permissões necessárias para criptografar o arquivo.

Eu já deparei com este problema de uma vez.

Eu realmente não posso dizer porque, mas eu não acho que cron executa com a mesma variável de ambiente como o usuário a fazer.

Eu realmente tive que exportar o bom caminho para a minha programas para executar bem.É gpg pelo menos tentar executar?

Ou são os arquivos que você está tentando encypt, na verdade, no diretório atual quando o cron executa?

Talvez tentar executar um echo whereis gpg e echo $PATH no seu script para ver se ele está incluído...Funcionou para mim.

@skinp Cron jobs são executados pelo sh, considerando que a maioria dos modernos Unixes usar o bash ou ksh para logons interativos.O maior problema (na minha experiência) é que o sh não entende coisas como:

export PS1='\u@\h:\w> '

o que precisa ser alterado para:

PS1='\u@\h:\w> '
export PS1

Então, se cron executa um shell script que define uma variável de ambiente usando a primeira sintaxe, antes de executar alguns outros comandos, o comando nunca será executado, pois sh bombas tentando definir a variável.

No meu caso:"gpg:falha na descriptografia:Ruim chave de sessão".

Tentei adicionar /usr/bin/gpg, verificar a versão, definição --lote, definição-casa (com /root/.gnupg e /home/usuario/.gnupg) e todos não funciona.

/usr/bin/gpg -d --batch --homedir /home/ec2-user/.gnupg --no-mdc-warning -quiet --passphrase "$GPG_PP" "$file"

Acabou que cron em AWS beanstalk instância necessária a variável de ambiente a ser utilizado para definir a-frase-senha $GPG_PP.Cron agora:

0 15 * * * $(source /opt/elasticbeanstalk/support/envvars && /home/ec2-user/bin/script.sh >> /home/ec2-user/logs/cron_out.log 2>&1)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top