24

画面がシェルまたはAppleScriptでロックされているかどうかを確認する方法はありますか?スクリーンセーバーが実行されているかどうかを確認するだけでなく、省エネ設定またはを押すことで画面がロックされます⌃⇧⏏</kbd> (shift+control+eject).

前もって感謝します。

4

3 に答える 3

33

まず、あなたの質問には少し混乱があります。Shift + Control +EjectとEnergySaverはどちらも画面をスリープ状態にしますが、これは画面をロックすることと同じではありません。他の設定によっては、これも画面のロックを伴う場合がありますが、それは別の問題です。ライオンのIIRCは、デフォルトではどちらも画面をロックしませんが、セキュリティとプライバシーで設定された時間より長く画面をスリープ状態のままにすると、画面がロックされます。

とにかく、APICGSessionCopyCurrentDictionaryを使用すると、GUIセッションの画面スリープと画面ロックの両方に関する情報を取得できます。GUIセッションがない場合(たとえば、sshシェルで実行しているため)、またはセッションがコンソールを所有していない場合(たとえば、誰かが高速ユーザーから切り替えたため)、この情報を取得することはできませんが、少なくともこれらのケースを検出することはできます。

これは私が知っている唯一のメカニズムであり、10.5(実際には10.3)から10.8までのすべてのOSで機能します(ただし、実際に存在するのはそれだけではありません…)。

これをbashまたはAppleScriptから直接呼び出す方法はありません。ただし、お気に入りのブリッジ(PyObjC、MacRuby、ASOCなど)を使用して、間接的に呼び出すことができます。Pythonを使用した例を次に示します。

#!/usr/bin/python
import Quartz
d = Quartz.CGSessionCopyCurrentDictionary()
print d

応答を解釈する方法は次のとおりです。

  • 何も返されない場合は、UIセッションがありません。
  • 辞書にkCGSSessionOnConsoleKey=0があるか、存在しない場合は、GUIセッションがコンソールを所有していないか、コンソールの画面がスリープ状態になっています。
  • 辞書のCGSSessionScreenIsLocked値が1の場合、画面はロックされています。

問題の1つは、kCGSSessionOnConsoleKeyが0(または欠落)でCGSSessionScreenIsLocked1である場合です。この場合、画面をスリープ状態にしてロックしたか、他の誰かがコンソールを使用して画面をロックしました(画面を配置するかどうかに関係なく)。寝るため)。そして、これらのケースを区別する方法があるかどうかはわかりません。ただし、「ユーザーが最初に画面のロックを解除する必要があるため、ダイアログを表示しようとしないでください」を探している場合は、どちらの場合も「ダイアログを表示しない」ことを意味します。

だから、これはあなたが望むものをあなたに与えるはずです:

#!/usr/bin/python
import sys
import Quartz
d=Quartz.CGSessionCopyCurrentDictionary()
sys.exit(d and 
         d.get("CGSSessionScreenIsLocked", 0) == 0 and 
         d.get("kCGSSessionOnConsoleKey", 0) == 1)

または、シェルスクリプトに直接配置できるワンライナーに変換します。

python -c 'import sys,Quartz; d=Quartz.CGSessionCopyCurrentDictionary(); sys.exit(d and d.get("CGSSessionScreenIsLocked", 0) == 0 and d.get("kCGSSessionOnConsoleKey", 0) == 1)'

では、MacにSSH接続していて、現在そのMacのGUIコンソールに(同じユーザーとして)ログインしている場合はどうでしょうか。その場合、sshログインセッションは、ローカルターミナルログインセッションとまったく同じ方法でコンソールログインセッションと通信できます。したがって、CGSessionCopyCurrentDictionaryは同じ値を取得します。

その接続を仲介するブートストラップサーバーはいくつかの制限を適用します(たとえば、security authorize -u fooターミナルからは機能しますが、ssh経由では機能しないはずです)が、それらは完全に文書化されておらず、バージョンごとに変わるため、おそらく信頼したくないものです。代わりに、ログインセッション情報を実際に読みたい

これをさらに進めたい場合は、複数のユーザー環境のプログラミングトピックを読むことから始めてください。ただし、一部の情報は実際にはどこにも文書化されていません(たとえば、によって参照されるMachレベルのセッションとによって参照されるSessionGetInfoBSDレベルのセッションがどのようにutmpx結び付けられているか)。関連するツールやライブラリの多くはオープンソースであり、役立つ可能性があります。これらすべてを読んでも、やりたいことを行う方法がわからなくても、やりたいことや、検索や質問に使用する適切な用語がわかります。これで十分かもしれません。

于 2012-07-16T19:43:23.310 に答える