D-Bus'a uzaktan erişim kurmaya çalışıyorum ve kimlik doğrulama ve yetkilendirmenin (çalışmıyor) nasıl çalıştığını anlamıyorum.
Soyut bir soketi dinleyen bir D-Bus sunucum var.
$ echo $DBUS_SESSION_BUS_ADDRESS
unix:abstract=/tmp/dbus-g5sxxvDlmz,guid=49bd93b893fe40d83604952155190c31
dbus-monitor
Neler olup bittiğini izlemek için koşuyorum . Test durumum notify-send hello
, yerel makineden yürütüldüğünde çalışan.
Aynı makinedeki başka bir hesaptan, bu veriyoluna bağlanamıyorum.
otheraccount$ DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-g5sxxvDlmz,guid=49bd93b893fe40d83604952155190c31 dbus-monitor
Failed to open connection to session bus: 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.
otheraccount$ DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-g5sxxvDlmz,guid=49bd93b893fe40d83604952155190c31 notify-send hello
D-Bus spesifikasyonuna göz attıktan sonra ~/.dbus-keyrings/org_freedesktop_general
, diğer hesaba kopyaladım , ancak yardımcı olmuyor.
Ben esinlenerek TCP üzerinden D-Bus soketi, yönlendirme çalıştı schedar 'ın Erişim D-Bus uzaktan SoCat kullanarak .
socat TCP-LISTEN:8004,reuseaddr,fork,range=127.0.0.1/32 ABSTRACT-CONNECT:/tmp/dbus-g5sxxvDlmz
TCP soketine hesabımdan bağlanabiliyorum.
DBUS_SESSION_BUS_ADDRESS=tcp:host=127.0.0.1,port=8004 notify-send hello
Ama öteki hesaptan değil, ne ile dbus-monitor
ne de notify-send
. dbus-monitor
Soyut soket ile aynı hata mesajı ; notify-send
şimdi bir iz yayıyor:
otheraccount$ DBUS_SESSION_BUS_ADDRESS=tcp:host=127.0.0.1,port=8004 notify-send hello
** (notify-send:2952): WARNING **: The connection is closed
Stracing, bu sürümünün notify-send
çerez dosyasını okumaya çalışmadığını, bu yüzden neden bağlanamayacağını anlıyorum.
Ayrıca SSHing'i başka bir makineye denedim ve TCP bağlantısını yönlendirdim.
ssh -R 8004:localhost:8004 remotehost
Şaşırtıcı bir şekilde, dbus-monitor
bir çerez dosyası olmadan çalışır! Uzak ana bilgisayardan D-Bus trafiğini izleyebilirim. Yerel örneğimde gizli dinleme hakkında bir uyarı görüyorum dbus-monitor
.
remotehost$ DBUS_SESSION_BUS_ADDRESS=tcp:host=127.0.0.1,port=8004 dbus-monitor
signal sender=org.freedesktop.DBus -> dest=:1.58 serial=2 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired
string ":1.58"
method call sender=:1.58 -> dest=org.freedesktop.DBus serial=2 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=AddMatch
string "eavesdrop=true"
notify-send
Yerel makinede çalışırsam dbus-monitor
, uzak ana bilgisayarda bildirimi görür. Kesinlikle kimlik doğrulaması gerektiren bir erişim düzeyine ulaştı.
notify-send
bir çerez bulamadığından şikayet etti. Çerez dosyasını kopyaladıktan sonra notify-send
, uzak makineden çalışır.
Yerel makine Debian'ı hırıltılı olarak çalıştırıyor. Uzaktaki makine FreeBSD 10.1 çalıştırır.
D-Bus kimlik doğrulamasının ve yetkilendirmesinin nasıl çalıştığını anlamıyorum.
- Uzak makineden kimlik bilgileri olmadan neden anlatabildiğim kadarıyla kulak misafiri olabilirim? D-Bus'ı bir TCP bağlantısına ilettiğimde ne açığa çıkarıyorum? Yetkilendirmeler neden farklı
dbus-monitor
venotify-send
farklı? - Soyut soket üzerinden veya TCP bağlantısı üzerinden neden aynı makinedeki başka bir hesaptan dinleyemiyorum?
- Çerez dosyasının birkaç dakikada bir değiştiğini fark ettim (düzenli aralıklarla olup olmadığını anlayamadım). Neden?
(TCP'yi dinleyen bir D-Bus arka plan programı başlatabileceğimi biliyorum. Sorumun amacı bu değil, neden yaptığımı ve çalışmadığımı anlamak istiyorum.)
SCM_CREDENTIALS
özel olarak kullanılmamaktadır. Linux'taSO_PEERCRED
bunun yerine soket seçeneğini kullanır.