¿Es posible firmar confirmaciones sin escribir una frase de contraseña desde un script ejecutado a través de Launch Agent? Si es así, ¿cómo debo configurar gpg-agent
para que funcione? Tenga en cuenta que no escribo la frase de contraseña cuando confirmo desde el shell, por lo que esa parte está funcionando.
Ahora que se hace la pregunta, permítame compartir más antecedentes sobre mi problema.
Cada vez que ejecuto gpg
en un script que se está ejecutando a través de Launch Agent, veo el siguiente error en los registros.
gpg: cannot open '/dev/tty': Device not configured
error: gpg failed to sign the data
fatal: failed to write commit object
En ese script estoy tratando de escribir el compromiso con la firma. El script se encuentra en $HOME/.local/bin
. El archivo de mi agente plist
está siguiendo.
<?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>
Estoy iniciando este agente manualmente mediante el siguiente comando (asegurándome de que el agente esté cargado antes de iniciarlo).
$ launchctl start com.example.signed_commit
El script es bastante simple.
#!/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')"
Como puede ver, para fines de prueba estoy creando un repositorio de prueba donde creo confirmaciones vacías. Pero siempre falla con el error que publiqué al principio de esta publicación.
Configuraciones relevantes para 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
Cuando ejecuto gpg --version
en ese script, veo lo siguiente en la salida del agente.
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
Lo que es idéntico a lo que veo cuando ejecuto gpg --version
solo en mi shell.