2012-07-16 13 views
14

画面がシェルまたはAppleScriptでロックされているかどうかを確認する方法はありますか? はちょうどスクリーンセーバーが実行されているか確認しますが、画面はエネルギーセーバーの設定によって、または^⇧⏏シフト + 制御 + イジェクト)を押すことによりロックされているわけではありません。OSX:画面がロックされていることを確認してください

ありがとうございます。

答えて

20

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

とにかく、API CGSessionCopyCurrentDictionaryでは、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の場合、画面はロックされます。

kCGSSessionOnConsoleKeyが0(または欠落)ここで一つの問題ケースがあるとCGSSessionScreenIsLockedはどちらか、その場合には1であるあなたがスリープ状態にスクリーンを置き、それらをロックし、または他の誰かがコンソールを取られ、ロックされていましたスクリーン(スリープ状態にするかしないか)。これらのケースを区別する方法があるかどうかはわかりません。しかし、「最初に画面のロックを解除する必要があるため、ダイアログを表示しないようにしてください」と考えている場合は、「ダイアログを表示しない」という意味です。ワンライナーにそれを回すあなたは、シェルスクリプトに直接置くことができ、

#!/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'dしています。あなたはです。は、そのMacのGUIコンソールに(同じユーザとして)現在ログインしていますか?その場合、sshログインセッションは、ローカル端末ログインセッションとまったく同じ方法でコンソールログインセッションと通信できます。したがって、CGSessionCopyCurrentDictionaryは同じ値を取得します。

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

さらに進んでいただきたい場合は、Multiple User Environments Programming Topicsから始めてください。しかし、情報の一部は実際にはどこにも記録されていません(例えば、SessionGetInfoで参照されるMachレベルのセッションとutmpxによって参照されるBSDレベルのセッションがどのように結びついているか)。関連するツールとライブラリの多くはopen sourceです。たとえそれをすべて読んでも、あなたが望むことをする方法がわからなくても、あなたが望むものを正確に教えてくれるでしょうし、検索や質問に使う正しい言葉もあります。

+0

セキュリティ設定(スリープとスクリーンセーバーにすぐにパスワードが必要)により、この状態のいずれかがコンピュータをロックするため、「ロック」を意味します。 詳しい回答はありがとうございます。 実際には、現在の電源状態について、_ioreg -n IODisplayWrangler_を解析することで自分の仕事を解決しました。 – LevB

+0

ありがとうございます。ユーザーがGUIセッションに参加しているかどうかを調べようとしていましたが、PythonのQuartzモジュールは非常に便利です。 (悲しいことですが、MacにSSHすると、あなたのスクリプトスニペットはGUIコンソールのときと全く同じ出力を返します)SSH固有の環境変数を確認できますが、より正確になる... – mpontillo

+0

私のコメントは長すぎるため、上記の回答に追加します。 – abarnert

関連する問題