私のユースケースは、ソフトウェア開発が実行されるヘッドレスサーバーがあることです。通常、SSH接続のX11転送を有効にしますが、接続が遅い遠隔地では使用できません。
定期的にツリー内の18〜20のリポジトリで作業するため、git資格情報の安全なストレージとキャッシュが必要です。そのため、git-credential-gnome-keyringをgit credential.helperとして使用し、libgnome-keyringを使用して通信しますgnome-keyring-daemonへ。ソリューションをテストするために、モニター付きのPCをセットアップし、システムでデフォルトでキーリングが機能することを確認してから、SSHで試してみました。X11転送で動作しますが、それなしでは動作しません。
X11転送なしで接続している場合、キーリングを照会すると次のエラーが発生し、ツールはコマンドラインでのプロンプトにフォールバックします。
** (process:18305): CRITICAL **: Error communicating with gnome-keyring-daemon
調査の結果、基本的な問題は、gnome-keyring-daemonが接続にdbusを使用して通信することを期待していることです。X11セッションがない場合、dbusは開始されないため、gnome-keyring-daemonとlibgnome-keyringが接続するための一般的なdbusバスはありません。
他の人がこの問題に投稿した2つの解決策を見つけましたが、どちらも私にはうまくいきません。
- X11を使用する既存のセッションからDBUSポートを取得します
- 新しいDBUSポートを手動で起動する
既存のDBUSポートに接続する場合の基本的な概念は、既存のログインセッションのPIDを見つけ、procfsからそのPIDの環境をダンプし、それを検索して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-セッション/
sshログインで実行される.bashrcに追加されたコード:
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を手動で起動する2番目の方法ではdbus-launch
、新しいセッションを作成DBUS_SESSION_BUS_ADDRESS
して環境に設定し、必要なすべてのサービスでgnome-keyring-daemonを起動して、作成したDBUSバスアドレスを確認します。空のバスアドレスではなく。このソリューションでは、システムごとに1つのインスタンスではなく、セッションごとに1つのインスタンスを実行するように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
アップグレードの場合に変更を失うことなくdbusサービスの「Exec」行を変更する方法
sshログインで実行される.bashrcに追加されたコード:
# 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と対話する方法については明確ではありませんが、2番目のエラーセットから明らかなように、新しく作成されたDBUSバスを介して到達できず、別のDBUSバスでクロスプロセスできません。私が見つけたもののいくつかは、gnome-keyring-daemonがその前にDBUSを起動する必要があるかもしれないと示唆していますが、それが使用法(libgnome-keyring)であるかデーモンであるかは不明です。
これをどのように機能させるのですか?