Fehlermeldung
gpg: signing failed: Inappropriate ioctl for device
Auch ausgegeben als
- [GNUPG:] FAILURE sign 83918950
Git gibt die Meldung unter „error: gpg failed to sign the data“ aus. Mit `--status-fd` gibt gpg zusätzlich `[GNUPG:] FAILURE sign 83918950` aus (den numerischen GPG-Fehlercode für diesen Zustand).
Git commit signing with GnuPG 2 — pinentry has no terminal
Was der Fehler bedeutet
Der Signaturschlüssel ist durch eine Passphrase geschützt, gpg-agent hat ein Pinentry-Programm für das Terminal gestartet, um sie abzufragen, und dieses konnte kein Terminal öffnen. „Inappropriate ioctl for device“ ist `ENOTTY` des Betriebssystems: stdin ist kein TTY, und `GPG_TTY` benennt keines. Schlüssel und Konfiguration sind in Ordnung; nur die Abfrage der Passphrase ist gescheitert.
Warum der Fehler auftritt
GPG_TTY ist nicht exportiert
häufigDie Dokumentation von GnuPG verlangt `export GPG_TTY=$(tty)` im Shell-Profil. Ohne diese Zeile weiß das Pinentry-Programm für curses nicht, wo es die Abfrage anzeigen soll.
Signieren aus einer IDE oder einem GUI-Client
häufigVS Code, JetBrains-IDEs und grafische Git-Clients führen git ohne Terminal aus. Ein Pinentry-Programm, das nur im Terminal läuft (`pinentry-curses`, `pinentry-tty`), kann dort nicht funktionieren.
Signieren in der CI mit einem durch Passphrase geschützten Schlüssel
gelegentlichEs gibt niemanden, der die Passphrase eintippt. Die CI braucht einen eigenen Schlüssel und einen nicht interaktiven Weg, die Passphrase zu übergeben.
So behebst du den Fehler
- 1.
GPG_TTY exportieren
Trage den Export in dein Shell-Profil ein; wurde der laufende Agent aus einem anderen Terminal gestartet, aktualisiere ihn mit `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.
Grafisches Pinentry-Programm verwenden
`pinentry-mac`, `pinentry-gnome3` oder `pinentry-qt` zeigen einen Dialog an, der auch mit IDEs funktioniert.
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.
Loopback-Pinentry für die Automatisierung
Mit `allow-loopback-pinentry` kann gpg die Passphrase aus einer Datei lesen. Verwende für die CI einen eigenen Schlüssel, der nur zum Signieren dient, nie einen persönlichen Schlüssel.
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
Verwandte Fehler
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)