web-dev-qa-db-ja.com

xセッションなしのgnome-keyringの使用法

私の使用例は、ソフトウェア開発が実行されるヘッドレスサーバーを持っている場合です。私は通常、SSH接続のX11転送を有効にしますが、接続が遅い遠くの場所ではできません。
ツリーで18〜20個のリポジトリを定期的に使用するため、git資格情報の安全なストレージとキャッシュが必要です。そのため、通信するgit credential.helperとしてgit-credential-gnome-keyringを使用しています。 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つの解決策を見つけましたが、どちらも適切に機能しません。

  1. X11を使用する既存のセッションからDBUSポートを取得する
  2. 新しいDBUSポートを手動で起動する

既存のDBUSポートに接続する場合、基本的な概念は、既存のログインセッションのPIDを見つけ、そのPIDの環境をprocfsからダンプし、DBUS_SESSION_BUS_ADDRESSを検索して、現在の環境にエクスポートすることです。これは、セッション内のすべてで使用されているDBUSバスを公開するために使用される変数なので、これを設定すると、セッション内のすべてが共通のDBUSバスで通信できるようになります。
ソースはこちら:
https://ubuntuforums.org/showthread.php?t=105902

https://ask.fedoraproject.org/en/question/45246/error-communicating-with-gnome-keyring-daemon-in-ssh-session/

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

2番目の方法は、セッションでDBUSを手動で起動する方法で、dbus-launchを使用して新しいセッションを作成し、環境にDBUS_SESSION_BUS_ADDRESSを設定してから、必要なすべてのサービスを使用してgnome-keyring-daemonを開始します。空のバスアドレスではなく、作成したDBUSバスアドレスが表示されます。このソリューションでは、システムごとではなくセッションごとに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)とデーモンのどちらの場合に当てはまるかは不明です。

これをどのように機能させるのですか?

14
mtalexan

これはばかげた答えかもしれませんが、少なくともマスターキーを要求するためには、gnome-keyringがX11セッションへのアクセスが必要です。したがって、設計上、実行することは不可能です。そうではありませんか?

編集:多分それ不可能ではないかもしれません。これを見てください post 、あなたの問題に似ています:

1
binarym