SSHからMacのグラフィカルログインを誘導する


16

SSHからMacのグラフィカルログインを誘導するにはどうすればよいですか?loginwindowMac OS Xで管理者としてSSH経由でリモートログインしたときにコマンドを実行して、プロセスにユーザーセッションを開始させる方法はありますか?

マシンがログインウィンドウにあるとき(現在ログインしているユーザーはいません)、ユーザー名をクリックしてパスワードを入力したかのように、ユーザーのセッションを開きます。

GUIのスクリプティングを必要としないソリューションは非常に好まれますが、このApple KBページその道を行く人にとって興味深いものです。

回答:


4

パスワードを知らないと事態が複雑になりますが、おそらく解決策は次のとおりです。ユーザーのパスワードを一時的に空白にすることは可能ですか?(その後、以前の状態にリセットします。)

はじめに:

まず、表示するログインウィンドウを取得します。現在のユーザーをログアウトするか、高速ユーザースイッチングを使用するか、SSHを使用します。

cd "/ System / Library / CoreServices / Menu Extras / User.menu / Contents / Resources /"
sudo ./CGSession -suspend

または、特定のユーザーにすぐに切り替えると、おそらくログインウィンドウが表示されます(これは私の10.5 Leopardでは突然機能しなくなります)。

sudo ./CGSession -switchToUserID 501

現在表示されているものはシステム環境設定に少し依存しますが、それがユーザーのアイコンと名前であると仮定しましょう。名前を有効にするには、最初の文字を入力する必要があります。次に、Returnの後、パスワードプロンプトが表示されます。または、任意の名前を選択し(下矢印キーを押すなど)、Optionキーを押しながらReturnキーを押してユーザー名とパスワードの両方の入力を求められます。どの画面が表示されているかを知る方法はわかりませんが、後で保存するために保存しましょう...

したがって、最初の(ランダムな)ユーザー名を選択してOption-Returnを押すには、特定のユーザー名を入力し、Returnを押してパスワードを入力します。

sudo osascript -e 'アプリに「システムイベント」と伝える
  キーコード125
  オプションdownを使用したキーストロークリターン
  キーストローク「ユーザー名」
  遅延1.0
  キーストロークリターン
  遅延1.0
  キーストローク「パスワード」
  遅延1.0
  キーストロークリターン
終わらせる

上記はいくつかのエラーを示していますが、私が知る限り、それは使用を制限しません:

osascript [285]:3891612:(connectAndCheck)信頼できないアプリは 
    ログインする前にWindow Serverに接続または起動できるようにします。
_RegisterApplication()、へのデフォルト接続の確立に失敗しました
    WindowServer、_CGSDefaultConnection()はNULLです。

または、「Apple Remote Desktopを介してログインウィンドウをスクリプト化する」の言語固有のスクリプトを使用します(ある日、そのサイトのコメントがより良い解決策を示すかもしれません)。

プロセス「SecurityAgent」を伝えます
  ウィンドウ1のグループ1のテキストフィールド1の値を「ユーザー名」に設定します
  ウィンドウ1のグループ1のテキストフィールド2の値を「パスワード」に設定します
終わらせる
アプリケーションプロセス「SecurityAgent」のウィンドウ1の「ログイン」ボタンをクリックします

しかし、主な問題は、これにはまだパスワードが必要なことです。ただし、ユーザーのパスワードが空白の場合、パスワードは明らかに不要です。実際、空のパスワードの場合、ユーザーのアイコンをクリックするだけで十分です。そのため、AppleScriptを使用してキーストロークを送信することが許容される場合、おそらく「すべて」が残ります。

  • ユーザーのパスワードを一時的に空白にして、そのパスワードを知らなくてもセッションを開始(または再開)できるようにすることは可能ですか?

  • AppleScriptをエラープルーフにできますか?お気に入り:

    • ログインウィンドウが表示されているかどうかを確認する方法は?(おそらく、ログインウィンドウが表示されている間に結果が得られるstat -f%Su /dev/consoleため、役立ちます)root
    • どのログインウィンドウが表示されるかを確認する方法は?(たとえば:アイコンとログイン名、またはドロップダウンリストを表示するもの、または誰かが特定のユーザーに切り替えることを選択した場合にのみパスワードプロンプトを表示するもの)
    • 遅延を取り除きます。
    • そのエラーメッセージはどうですか?

テストするための(Aノート:それはそう画面共有を使用した場合、その優先順位を設定するコンピュータ制御する場合:暗号化パスワードをのみキーストロークも、ログインウィンドウが表示されたときに、接続を維持し、または使用している場合、ユーザーの後に正常にログインしました。暗号化はすべてのネットワークをデータが表示されると、ログインが表示されるかユーザーが切り替えられるたびに、Macで画面共有接続を再確立する必要があります。


これは良いスタートですが、2つの問題があります。まず、ログインウィンドウにいる場合は機能しません。これは私が望んでいたことであり、パスワードを要求しますが、パスワードは要求しませんでした。ルートであるため、パスワードなしでユーザーを切り替えることができるはずです。
ソフィーアルパート

あぁ。コンピューター自体の前に他のユーザーとしてログインする方法すら知らないので、のための葉巻はありませんsudo osascript -e 'tell app "System Events" to keystroke "password" & return'。画面がロックされた状態で、管理ユーザー名とパスワードを入力すると、他のユーザーのセッションが再開されます。しかし、パスワードを知らずにユーザーのセッションを開始する方法は?(確かに、パスワードを知っていれば:別の回避策はログイン画面でも機能する画面共有です。特定のユーザーセッションが開始または再開された後、画面共有を再接続する必要があります。)
Arjan

これはいい。ただし、キーストロークを手動でシミュレートせずに解決策を希望します。
ソフィーアルパート

2
誰か他の人のためにセッションを開始する方法を知っている人がいるのだろうか。したがって、上記の答えを考慮せずに、Mac OS Xを日常的に使用する場合、管理者は別のユーザーとして、そのユーザーのパスワードを知らなくてもログインできますか?suコマンドプロンプトと同様ですが、GUIセッションの場合。または、画面がロックされている場合と同様に、管理ユーザー名とパスワードを入力すると他のユーザーのセッションが再開されます。)
Arjan

おそらく、AppleScriptのキーストロークなしではできません。docs.info.apple.com
ソフィーアルパート

1

私は最近これを調査しています。

これをアプリのPAMスタックに配置するか、sshdでテストします。

session    required       pam_launchd.so launchd_session_type=Aqua

これは、切り替えられたユーザーセッションに非常に近いグラフィカルセッションを取得するのに大いに役立ちます。特に、それは正しいブートストラップ名前空間にあり、正しいブートストラップポートを持っています(私は思う)。pam_launchdの機能についてソースを確認できます。合理的な外観のプライベートライブラリ(libvpropのvproc_priv.h関数)を使用して、ポートと名前空間を設定するためにMachルーチンを呼び出しています。これは、AppleがMachから派生したsyscallsに提供するすべての(制限付きの)ドキュメントと一致します。

次に、BSM APIを使用して、監査ユーザーIDをユーザーの監査ユーザーIDに設定する必要があります。そうしないと、ログインウィンドウがLionでユーザーと通信しません。

「launchctl blist」をチェックすると、セッションはスイッチアウトされたセッションに非常に近くなり、一部のプロセスとサービスがうまく機能します(ペーストボードなど)。実際、Finderとloginwindowを除くすべてが実行されています。ただし、loginwindowが実行されるまで、グラフィカルアプリケーションを起動することはできず、セッションごとのloginwindowプロセスは常にグローバルプロセスの直接の子として生成されます。新規セッションでloginwindowプロセスを起動して新しいloginwindowを起動するにはどうすればよいですか?最後のピースを配置する方法が見つかりません!

この回答を完了するのに感謝します。


0

sudoを使用してコマンドを実行すると、標準ユーザーがスクリプトを読み取れないように設定できます。それは完璧ではありませんが、管理者ユーザーが既に侵害されている場合、ゲームオーバーです!

chmod urスクリプト名

私のスクリプトは次のようになります。1人のユーザーが既に実行されているときにリモートで動作し、SSHを介して2番目のユーザーに切り替えます(Snow Leopard 10.6.3でテスト済み)。

#!/bin/bash
#go to login window
/System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -switchToUserID 503

osascript -e 'tell app "System Events"
keystroke "password"
  delay 1.0
  keystroke return
end tell'

exit

0

ソフトウェアの更新を行うには、同じユーザーを25の異なるワークステーションにログインする必要がありました。sudo権限でも、SSHセッションから「osascript -e ...」コマンドを確実に実行できませんでした。しかし、Apple Remote Desktop経由で実行できました。ARDがある場合:

  1. マシンを選択してください
  2. 必要に応じてそれらを起動し、他のユーザーからログアウトします
  3. 「管理」メニューから「UNIXコマンドを送信...」を選択します
  4. Arjanのスクリプト(「sudo」という単語は省略)をコマンドダイアログボックスに貼り付けます。
  5. 「コマンドを実行するユーザー:root」を選択して入力します

ユーザーとしてFinderを実行している25台すべてのMac Miniが1分もかからずに見つかりました。繰り返しになりますが、ARDを使用すると、すべてのマシンでsudoパスワードを入力する必要がありません。コマンドダイアログに貼り付ける必要がある行は次のとおりです(有効なユーザー名とパスワードに置き換えます)。

osascript -e 'tell app "System Events"
  key code 125
  keystroke return using option down
  keystroke "the username"
  delay 1.0
  keystroke return
  delay 1.0
  keystroke "the password"
  delay 1.0
  keystroke return
end tell'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.