Вероятно, это проблема с разрешением файлов устройств. pinentry
не использует унаследованные дескрипторы файлов, а пытается получить прямой доступ к переданному TTY, что не работает.
Вы можете запустить tty
в оболочке и затем ls -l /dev/pts/1
с результатом, и вы, вероятно, заметите, что apache
не имеет к нему доступа.
Вы также можете запустить
strace -o gpg.strace -f -e trace=open gpg --gen-key
и, вероятно, найдете что-то вроде
open("/dev/pts/1", O_RDONLY) = -1 EACCES (Permission denied)
Опасное решение - это (временно) дать apache
доступ к root
консоли.... (chown apache /dev/pts/1
). Лучшим решением будет реальный вход в систему как apache
.
Это влияет только на генерацию ключей. Вы также можете создать пару ключей как другой пользователь, экспортировать её и импортировать в учётную запись apache
.
Если вы не можете выяснить это из системной конфигурации или из онлайн-поиска, используйте loggedfs или auditd для мониторинга доступа к файлу. Смотрите Как определить, какой процесс создает файл?
Например, с помощью подсистемы аудита :
auditctl -a exit,always -w /etc/apt/sources.list.d/multistrap-debian.list
и просматривайте журналы в /var/log/audit/audit.log
. Это скажет вам имя процесса, который изменяет файл. Вы можете захотеть посмотреть, что вызывает его; это можно сделать, установив на исполняемом файле часы, например
auditctl -a exit,always -w /usr/lib/somewhere/strange/apt-source-list-editor
, и вы получите запись для системного вызова execve
, который выполняет программу.