Message d’erreur
gpg: signing failed: Inappropriate ioctl for device
Également affiché sous la forme
- [GNUPG:] FAILURE sign 83918950
Git l’affiche sous « error: gpg failed to sign the data ». Avec `--status-fd`, gpg émet aussi `[GNUPG:] FAILURE sign 83918950` (le code d’erreur numérique de GPG pour cette situation).
Git commit signing with GnuPG 2 — pinentry has no terminal
Ce que cela signifie
La clé de signature est protégée par une phrase de passe ; gpg-agent a lancé un pinentry en mode terminal pour la demander, et pinentry n’a pas pu ouvrir de terminal. « Inappropriate ioctl for device » est l’erreur `ENOTTY` du système d’exploitation : stdin n’est pas un TTY et `GPG_TTY` n’en désigne aucun. La clé et la configuration sont correctes ; seule la demande de phrase de passe a échoué.
Pourquoi cela se produit
GPG_TTY n’est pas exporté
fréquenteLa documentation de GnuPG exige `export GPG_TTY=$(tty)` dans le profil du shell. Sans cette ligne, le pinentry curses ne sait pas où afficher l’invite de saisie.
Signature depuis un IDE ou un client graphique
fréquenteVS Code, les IDE JetBrains et les clients Git graphiques exécutent git sans terminal. Un pinentry limité au terminal (`pinentry-curses`, `pinentry-tty`) ne peut pas y fonctionner.
Signature en CI avec une clé protégée par une phrase de passe
occasionnellePersonne n’est là pour saisir la phrase de passe. La CI a besoin d’une clé dédiée et d’un moyen non interactif de fournir la phrase de passe.
Comment corriger l’erreur
- 1.
Exporter GPG_TTY
Ajoutez-le à votre profil de shell ; si l’agent en cours d’exécution a été lancé depuis un autre terminal, mettez-le à jour avec `updatestartuptty`.
bash # ~/.bashrc or ~/.zshrc export GPG_TTY=$(tty) # if gpg-agent was started before, tell it about the current terminal gpg-connect-agent updatestartuptty /bye - 2.
Utiliser un pinentry graphique
`pinentry-mac`, `pinentry-gnome3` ou `pinentry-qt` affichent une boîte de dialogue, ce qui fonctionne aussi avec les IDE.
bash # macOS (Homebrew): a GUI pinentry works for IDEs and GUI Git clients too brew install pinentry-mac echo "pinentry-program $(brew --prefix)/bin/pinentry-mac" >> ~/.gnupg/gpg-agent.conf gpgconf --kill gpg-agent - 3.
Pinentry en mode loopback pour l’automatisation
Avec `allow-loopback-pinentry`, gpg peut lire la phrase de passe dans un fichier. Utilisez une clé dédiée à la CI et réservée à la signature, jamais une clé personnelle.
bash # CI: a dedicated signing key; passphrase supplied non-interactively via loopback pinentry echo "allow-loopback-pinentry" >> ~/.gnupg/gpg-agent.conf && gpgconf --kill gpg-agent cat > /usr/local/bin/gpg-ci <<'EOF' #!/bin/sh exec gpg --batch --pinentry-mode loopback --passphrase-file "$GPG_PASSPHRASE_FILE" "$@" EOF chmod +x /usr/local/bin/gpg-ci git config --global gpg.program gpg-ci
Erreurs associées
error: gpg failed to sign the dataGit (commit -S, tag -s, commit.gpgsign) with GnuPGsign_and_send_pubkey: signing failed for RSA "/path/to/key" from agent: agent r…OpenSSH client with an SSH agent (ssh-agent, gpg-agent, 1Password, Secretive, Windows OpenSSH agent)gpg: Can't check signature: No public keyGnuPG (gpg --verify, git verify-commit / verify-tag / log --show-signature)