2012-05-15 100 views
2

我目前正試圖檢測用戶在Linux平臺上快速用戶切換到另一用戶(特別是Fedora 14-16,RedHat 4.7-6.x,CentOS 4-6 ,OpenSuse 10-11)。我一直在尋找類似於Windows上可用的WTSRegisterSessionNotification()函數的東西,但我遇到的所有內容都是對Wine軟件中一些錯誤的引用。檢測快速用戶切換Linux

有沒有其他人穿過這個障礙?似乎有很多關於如何在Windows和Mac OS X(這是很好)做到這一點的資源,但在Linux上似乎沒有什麼...

編輯: 顯然,在較新的系統(在至少Fedora 16)this似乎是一個可行的選擇。我想知道它是否有一個DBus接口...更多即將推出!

+0

也許從顯示管理器尋找適當的dbus信號? – Novelocrat

+1

但是你爲什麼要想知道呢?這聽起來像是一個設計錯誤,除了xlock之類的一些特殊情況。 –

+0

@jørgensen這樣做有很好的理由,例如產生一個VNC服務器來遠程激活X服務器,並在FUS發生時重新創建它。 –

回答

0

看來,獲取這些信息的最有用的方法是使用ConsoleKit DBus interface

以下步驟概述如何枚舉會話和確定它們是否有效或不是:

Bus: org.freedesktop.ConsoleKit 
    Path: /org/freedesktop/ConsoleKit/Manager 
    Method: org.freedesktop.ConsoleKit.Manager.GetSessions 

什麼返回是一個磁盤陣列:

1)使用以下枚舉會話的導出Session接口的對象路徑。反過來,這些可以使用DBus查詢以獲得其適當的屬性。例如,我使用的dbus-發送與ConsoleKit的溝通,列舉在我的系統的會話:

dbus-send --system --print-reply --dest=org.freedesktop.ConsoleKit /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.GetSessions

而我收到的回報是以下幾點:
method return sender=:1.15 -> dest=:1.205 reply_serial=2 array [ object path "/org/freedesktop/ConsoleKit/Session2" ]

2)使用返回的對象路徑(S),我可以查詢他們的屬性,例如,如果它們是活性的或不使用以下:

Bus: org.freedesktop.ConsoleKit 
    Path: /org/freedesktop/ConsoleKit/Session2 
    Method: org.freedesktop.ConsoleKit.Session.IsActive 

根據不同的方法,我可以從會話中查詢我需要的內容!使用ConsoleKit接口,我還可以檢索當前會話的標識符,所以我可以隨時查詢它,以便在需要時查看它是否處於活動狀態。只是爲了好玩,這裏是以下命令的輸出:

dbus-send --system --print-reply --dest=org.freedesktop.ConsoleKit /org/freedesktop/ConsoleKit/Session2 org.freedesktop.ConsoleKit.Session.IsActive

方法的返回發件人= 1.15 - > DEST =:1.206 reply_serial = 2 邏輯真

整潔。

1

首先,我需要告訴你,我不是這方面的專家,但我有足夠的知識給你指點,你可以去的地方,瞭解更多。所以我在某些方面可能是錯的。

我的猜測是:

  • 這是不容易的
  • 對於大多數方法,你可以實現大概有許多方法來哄騙相信的東西,是不正確的,這可能會導致安全問題
  • 你的方法可能取決於:
    • 選擇Linux發行
    • 發佈版
    • 桌面環境
    • 顯示管理器

據我知道(如果在過去幾年裏的東西改變了我可能是錯的),快速用戶切換是由另一啓動另一個X服務器實施VT。因此的一種方法是檢測是否有多個X服務器在運行。

但有很多情況下,有多個X服務器正在運行,並不是因爲用戶快速切換。示例:Multiseat或甚至簡單的Xephyr登錄。使用Xephyr和XDMCP,甚至可以讓用戶在非快速用戶切換的情況下登錄兩次。

我開始使用Google這個,發現這個舊網頁:

如果事情還沒有從那以後改變了,你應該學習ConsoleKit的以及對PolicyKit(也DeviceKit,也許系統今天)和他們的DBus API。

還有命令ck-list-sessionsck-launch-session。但我相信你可以很容易地愚弄這些命令:嘗試ck-launch-session xterm然後ck-list-session

爲什麼你正試圖檢測快速用戶切換?你的最終目標是什麼?也許你可以解決你的問題,而不會嘗試檢測快速的用戶切換...

+0

而現在,ConsoleKit在某些發佈到systemd-logind的發行版上也過時了。 –

+0

是的,我看到了那個舊的網頁。事實上,它似乎很有用,直到我注意到它的日期。我嘗試檢測快速用戶切換的原因是因爲我有一個運行在系統托盤中的通知小程序,我只希望它發出嘟嘟聲來通知用戶當且僅當它在活動用戶中運行會話(它不僅控制系統揚聲器,還控制內置於我們產品之一的硬件蜂鳴器)。每個用戶都可以配置硬件蜂鳴器,因爲每個用戶都可以選擇通過小程序爲其會話啓用/禁用它。所以,檢測FUS是必要的。 – codemaster91

+0

您確實應該考慮到,在某些機器中,有2個用戶登錄並主動使用計算機。不要以爲只有一個X服務器和/或只有一個用戶登錄。 – pzanoni

0

您必須通過輪詢來確保所有機器都能正常工作(您顯然不必讓DBus運行來執行用戶切換!)。

的Solaris,HP-UX和其他人不這樣做的用戶在控制檯上的開關。

平臺支持:Linux操作系統,FreeBSD的,AIX。 Linux/BSD使用虛擬終端;如果您有興趣,AIX使用/dev/lft0

假設您希望在控制檯上可靠安全地運行應用程序,並在控制檯切換到另一個VT時在新的活動X服務器上重新啓動它。問題是你可能會或可能沒有運行桌面環境(我們有些人使用twm!)。該會話可能尚未通過登錄管理器啓動(您可以在Linux上執行Ctrl-Alt-F2,登錄,然後非常高興地運行startx)。系統甚至可能沒有安裝xdm/gdm/similar。

愚蠢的解決方案是唯一可靠的解決方案:每隔幾秒查詢活動虛擬終端(linux上的VT_GETSTATE,BSD上的VT_GETACTIVE)。如果它改變了,你就知道一個開關發生了。如果您切換到非圖形會話(例如使用Ctrl-Alt-F1),則不會有X服務器處於活動狀態。

否則,您必須很難找到哪個顯示號碼處於活動狀態。例如,您可能會在ps中看到兩個X服務器,顯示編號爲1和:2。儘管那些是在VT7上?映射VT數字以顯示數字的最後一塊難題是最難的。這個問題在this duplicate question, "Which virtual terminal is a given X process running on?"回答。