È possibile firmare commit senza digitare passphrase da uno script eseguito tramite Launch Agent? In tal caso, come dovrei configurare gpg-agent
per farlo funzionare? Nota che non scrivo passphrase quando eseguo il commit dalla shell, quindi quella parte funziona.
Ora che la domanda è stata posta, permettimi di condividere più informazioni sul mio problema.
Ogni volta che eseguo gpg
in uno script che viene eseguito tramite Launch Agent, vedo i seguenti errori nei log.
gpg: cannot open '/dev/tty': Device not configured
error: gpg failed to sign the data
fatal: failed to write commit object
In quello script sto provando a scrivere commit con la firma. Lo script si trova in $HOME/.local/bin
. Il mio agente plist
sta seguendo.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.example.signed_commit</string>
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/Users/d12frosted/.local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
</dict>
<key>ProgramArguments</key>
<array>
<string>signed_commit</string>
<string>-o</string>
<string>/unrelated/arguments/</string>
</array>
<key>StartInterval</key>
<integer>21600</integer>
<key>StandardOutPath</key>
<string>/Users/d12frosted/Library/Logs/com.example.signed_commit.stdout</string>
<key>StandardErrorPath</key>
<string>/Users/d12frosted/Library/Logs/com.example.signed_commit.stderr</string>
</dict>
</plist>
Sto avviando manualmente questo agente tramite il seguente comando (assicurandoti che l'agente sia caricato prima di avviarlo).
$ launchctl start com.example.signed_commit
Lo script è piuttosto semplice.
#!/usr/bin/env bash
if [[ ! -d $HOME/test_repo ]]; then
mkdir -p "$HOME/test_repo"
cd "$HOME/test_repo"
git init
# setup signing (omitted, due to privacy)
fi
cd "$HOME/test_repo"
git commit --allow-empty -m "snapshot $(date '+%d/%m/%y %H:%M:%S')"
Come puoi vedere, per scopi di test sto creando un repository di test dove creo commit vuoti. Ma fallisce sempre con l'errore che ho postato all'inizio di questo post.
Configurazioni rilevanti per gpg
.
# $HOME/.gnupg/gpg.conf
require-cross-certification
keyserver hkp://keys.gnupg.net
use-agent
# $HOME/.gnupg/gpg-agent.conf
pinentry-program /usr/local/bin/pinentry-mac
Quando eseguo gpg --version
in quello script, vedo che segue nell'output dell'agent.
gpg (GnuPG) 2.0.30
libgcrypt 1.7.3
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Home: ~/.gnupg
Supported algorithms:
Pubkey: RSA, RSA, RSA, ELG, DSA
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
CAMELLIA128, CAMELLIA192, CAMELLIA256
Hash: MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2
Che è identico a quello che vedo quando si esegue gpg --version
nella mia shell.