2

私は現在、ユーザーが Linux プラットフォーム (具体的には、Fedora 14-16、RedHat 4.7-6.x、CentOS 4-6、OpenSuse 10-11) で別のユーザーにユーザーを高速切り替えしたことを検出しようとしています。Windows で使用できる WTSRegisterSessionNotification() 関数に似たものを探していましたが、Wine ソフトウェアのバグへの言及がたくさんあるだけでした。

他の誰かがこの障害に遭遇しましたか? Windows と Mac OS X でこれを行う方法に関するリソースは山ほどあるようですが (これは問題ありません)、Linux では何もないようです...

編集: どうやら、新しいシステム (少なくとも Fedora 16) では、これは実行可能なオプションのように見えるかもしれません。DBus インターフェースを備えているのだろうか...詳細は近日公開予定!

4

3 に答える 3

1

まず最初に、私はこの分野の専門家ではないことをお伝えしておく必要がありますが、どこに行って詳細を学べるかを示すには十分な知識があります。なので、ある意味間違っているかもしれません。

私の推測は次のとおりです。

  • これは簡単ではありません
  • 実装する可能性のあるほとんどのメソッドには、セキュリティ上の問題につながる可能性のある、真実ではないものを信じ込ませる方法がおそらくたくさんあります。
  • あなたの方法は以下に依存するかもしれません:
    • 選択した Linux ディストリビューション
    • ディストリビューションのバージョン
    • デスクトップ環境
    • 表示マネージャ

私の知る限り (過去数年間に何かが変わった場合は間違っている可能性があります)、別の VT で別の X サーバーを起動することにより、高速ユーザー切り替えが実装されています。したがって、1 つの方法、複数の X サーバーが実行されているかどうかを検出することです。

しかし、複数の X サーバーが実行されている場合が多くありますが、それはユーザーの切り替えが速いためではありません。例: マルチシートまたは単純な Xephyr ログイン。Xephyr と XDMCP を使用すると、非高速ユーザー切り替えの場合に、同じユーザーが 2 回ログインすることさえあります。

これについてグーグルで検索し始めたところ、次の古い Web ページが見つかりました。

それ以来状況が変わっていない場合は、ConsoleKit と PolicyKit (および DeviceKit とおそらく Systemd も) とそれらの DBus API を検討する必要があります。

コマンドck-list-sessionsck-launch-session. しかし、これらのコマンドは簡単にだますことができると思います: tock-launch-session xtermと then を試してくださいck-list-session

なぜユーザーの素早い切り替えを検出しようとしているのですか? あなたの究極の目標は何ですか?高速なユーザー切り替えを検出しようとせずに問題を解決できるかもしれません...

于 2012-05-16T12:32:33.470 に答える
0

すべてのマシンで確実に動作するようにするには、ポーリングする必要があります (ユーザーの切り替えを行うために DBus を実行する必要はありません!)。

Solaris、HP-UX などは、コンソールでユーザー切り替えを行いません。

サポートするプラットフォーム: linux、FreeBSD、AIX。Linux/BSD は仮想端末を使用します。興味がある場合は、 AIX を使用し/dev/lft0ます。

コンソールでアプリケーションを確実かつ安全に実行し、コンソールが別の VT に切り替わったときに新しいアクティブな X サーバーでアプリケーションを再起動するとします。問題は、デスクトップ環境を実行している場合と実行していない場合があることです (一部のユーザーは twm を使用しています!)。セッションは、ログイン マネージャーを介して開始されていない可能性があります (Linux で Ctrl-Alt-F2 を実行し、ログインして、問題なく実行できますstartx)。システムに xdm/gdm/similar がインストールされていない場合もあります。

ばかげた解決策が唯一の信頼できる解決策です。数秒ごとに、アクティブな仮想端末が何であるかを問い合わせます ( VT_GETSTATELinux の場合VT_GETACTIVE、BSD の場合)。変更された場合は、切り替えが発生したことがわかります。非グラフィカル セッション (Ctrl-Alt-F1 など) に切り替えた場合、X サーバーはアクティブになりません。

それ以外の場合は、アクティブなディスプレイ番号を見つけるのに苦労する必要があります。たとえば、 にps:1 と :2 の表示番号を持つ 2 つの X サーバーが表示される場合があります。それらのどれがVT7にありますか? VT 番号を表示番号にマッピングするパズルの最後のピースは、最も難しいものです。この質問は、この重複した質問「特定の X プロセスが実行されている仮想端末はどれですか?」で回答されています。.

于 2013-02-14T11:48:12.930 に答える
0

この情報を取得する最も便利な方法は、ConsoleKit DBus インターフェイスを使用することです。

次の手順は、セッションを列挙し、それらがアクティブかどうかを判断する方法の概要を示しています。

1.) 以下を使用してセッションを列挙します。

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

返されるのは、Session インターフェイスをエクスポートするオブジェクト パスの配列です。これらは、DBus を使用してクエリを実行し、適切なプロパティを取得できます。たとえば、dbus-send を使用して 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.) 返されたオブジェクト パスを使用して、以下を使用して、オブジェクトがアクティブかどうかなどの属性をクエリできます。

    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

method return sender=:1.15 -> dest=:1.206 reply_serial=2 boolean true

きちんとした。

于 2012-05-17T19:45:40.257 に答える