画面がシェルまたはAppleScriptでロックされているかどうかを確認する方法はありますか? はちょうどスクリーンセーバーが実行されているか確認しますが、画面はエネルギーセーバーの設定によって、または^⇧⏏(シフト + 制御 + イジェクト)を押すことによりロックされているわけではありません。OSX:画面がロックされていることを確認してください
ありがとうございます。
画面がシェルまたはAppleScriptでロックされているかどうかを確認する方法はありますか? はちょうどスクリーンセーバーが実行されているか確認しますが、画面はエネルギーセーバーの設定によって、または^⇧⏏(シフト + 制御 + イジェクト)を押すことによりロックされているわけではありません。OSX:画面がロックされていることを確認してください
ありがとうございます。
まず、ご質問に少し混乱があります。 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
ここ応答を解釈する方法は次のとおりです。
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です。たとえそれをすべて読んでも、あなたが望むことをする方法がわからなくても、あなたが望むものを正確に教えてくれるでしょうし、検索や質問に使う正しい言葉もあります。
セキュリティ設定(スリープとスクリーンセーバーにすぐにパスワードが必要)により、この状態のいずれかがコンピュータをロックするため、「ロック」を意味します。 詳しい回答はありがとうございます。 実際には、現在の電源状態について、_ioreg -n IODisplayWrangler_を解析することで自分の仕事を解決しました。 – LevB
ありがとうございます。ユーザーがGUIセッションに参加しているかどうかを調べようとしていましたが、PythonのQuartzモジュールは非常に便利です。 (悲しいことですが、MacにSSHすると、あなたのスクリプトスニペットはGUIコンソールのときと全く同じ出力を返します)SSH固有の環境変数を確認できますが、より正確になる... – mpontillo
私のコメントは長すぎるため、上記の回答に追加します。 – abarnert