Мой пример использования - у меня есть безголовый сервер, на котором выполняется разработка программного обеспечения. Обычно я включаю пересылку X11 для SSH-подключений к нему, но не могу для удаленных мест с медленными подключениями.
Мне нужно безопасное хранение и кэширование для моих учетных данных git, так как я регулярно работаю с 18-20 репозиториями в дереве, поэтому я использую git-credential-gnome-keyring в качестве git credential.helper, который взаимодействует с помощью libgnome-keyring к гному-брелоку-демону. Чтобы протестировать решения, я настроил ПК с монитором, подтвердил, что в системе по умолчанию работает связка ключей, затем попробовал его с SSH. Он работает с пересылкой X11, но не работает без него.
Когда я подключен без переадресации X11, при запросе связки ключей возникает следующая ошибка, и инструмент возвращается к запросу в командной строке:
** (process:18305): CRITICAL **: Error communicating with gnome-keyring-daemon
Расследование показывает, что основная проблема заключается в том, что gnome-keyring-daemon ожидает, что соединения будут использовать dbus для связи с ним. Dbus не запускается, если нет сеанса X11, поэтому нет общей шины dbus для подключения к gnome-keyring-daemon и libgnome-keyring.
Я нашел два решения, которые другие опубликовали для этой проблемы, хотя ни одно из них не работает для меня должным образом.
- Получить порт DBUS из существующего сеанса, который использует X11
- Вручную запустить новый порт DBUS
При подключении к существующему порту DBUS базовая концепция заключается в том, чтобы найти PID существующего сеанса входа в систему, выгрузить среду для этого PID из procfs, найти его DBUS_SESSION_BUS_ADDRESS
и экспортировать в текущую среду. Поскольку эта переменная используется для публикации шины DBUS, используемой всем в сеансах, ее установка должна позволять всему сеансу взаимодействовать по общей шине DBUS, хотя это шина, связанная с другим сеансом.
Источники здесь:
https://ubuntuforums.org/showthread.php?t=1059023
https://ask.fedoraproject.org/en/question/45246/error-communicating-with-gnome-keyring-daemon-in-ssh- Сессия /
Код добавлен в мой .bashrc, выполняемый при входе в систему через ssh:
if [ -z "$DBUS_SESSION_BUS_ADDRESS" ] ; then
local myPID=`pgrep "(.*session|fluxbox)" | head -n1`
if [ -n "$myPID" ] ; then
local myVar=`cat /proc/${myPID}/environ | grep -z "^DBUS_SESSION_BUS_ADDRESS=" | sed -e 's/DBUS_SESSION_BUS_ADDRESS=//'`
if [ -n "$myVar" ] ; then
export DBUS_SESSION_BUS_ADDRESS=$myVar
fi
fi
fi
Второй метод, вручную запускающий DBUS для сеанса, включает использование dbus-launch
для создания нового сеанса и установки DBUS_SESSION_BUS_ADDRESS
для среды, затем запуск gnome-keyring-daemon со всеми необходимыми службами, чтобы он видел адрес шины DBUS, который мы создали а не пустой адрес автобуса. Это решение может требовать или не требовать изменения gnome-keyring-daemon для запуска одного экземпляра на сеанс, а не одного экземпляра на систему, но это не ясно.
Источники:
Начиная с номера 8: https://support.wandisco.com/index.php?/Knowledgebase/Article/View/362/17/how-to-setup-encrypted-svn-password-storage-using-gnome- keyring-in-an-ssh-session
Как изменить строку «Exec» службы dbus без потери изменений в случае обновления
Код, добавленный в мой .bashrc, выполняется при входе в систему через ssh:
# then DBUS wasn't started for this session and needs to be
if [ -z "$DBUS_SESSION_BUS_ADDRESS" ] ; then
# start a new dbus session and make sure the variables are exported (automatic output)
eval `dbus-launch --sh-syntax`
# make sure gnome-keyring-daemon is using all the necessary components (it may not be by default)
# Capture the output, which is a series of variable setting commands, one on eachline, and
# export them while setting them
while read -r LINE
do
export $LINE
done <<< $(gnome-keyring-daemon --start --components=gpg,pkcs11,secrets,ssh)
fi
Оба решения дают одинаковый ошибочный результат. Вместо того, чтобы немедленно выдавать ошибку, указывающую, что с gnome-keyring-daemon невозможно связаться, процесс на некоторое время зависает, а затем выдает такой вывод:
Gkr-Message: secret service operation failed: Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken.
** (process:31155): CRITICAL **: Error communicating with gnome-keyring-daemon
Я не знаю, как gnome-keyring-daemon взаимодействует с DBUS, но из второго набора ошибок ясно, что он недоступен через вновь созданную шину DBUS или перекрестную обработку на другой шине DBUS. Кое-что из того, что я нашел, предполагает, что gnome-keyring-daemon может потребоваться запустить DBUS до него, но неясно, так ли это для использования (libgnome-keyring) или демона.
Как мне заставить это работать?