Индуцируйте Mac графический вход из SSH

7837
Sophie Alpert

Как мне вызвать графический вход Mac из SSH? Есть ли способ заставить loginwindowпроцесс запустить сеанс пользователя, выполнив команду при удаленном входе через SSH в качестве администратора в Mac OS X?

Когда машина находится в окне входа в систему (в данный момент ни один пользователь не вошел в систему), я хочу, чтобы он открыл сеанс пользователя, как если бы я нажал на имя пользователя и ввел пароль.

Решения, которые не включают создание сценариев с графическим интерфейсом, очень предпочтительны, но эта страница Apple KB может быть интересна для тех, кто идет по этому пути.

15

4 ответа на вопрос

4
Arjan

Незнание пароля усложняет задачу, но, возможно, решение таково: возможно ли временно удалить пароль пользователя? (И впоследствии сбросьте его на то, что было раньше.)

Для начала:

Во-первых, откройте окно входа в систему. Просто выйдите из текущего пользователя, используйте быстрое переключение пользователей или используйте SSH:

cd "/ Система / Библиотека / CoreServices / Дополнения меню / User.menu / Содержание / Ресурсы /" sudo ./CGSession -suspend 

Или, чтобы сразу переключиться на конкретного пользователя, который, вероятно, покажет окно входа в систему (это внезапно больше не работает на моем 10.5 Leopard):

sudo ./CGSession -switchToUserID 501

То, что показано сейчас, немного зависит от системных настроек, но давайте предположим, что это значки пользователей и их имена. Чтобы активировать имя, мы должны ввести первые буквы. Затем после возврата отображается запрос пароля. В качестве альтернативы можно выбрать любое имя (например, нажав стрелку вниз), а затем нажать Option-Return, чтобы запросить любое имя пользователя и его пароль. Я не знаю, как можно определить, какой экран отображается, но давайте сохраним это на потом ...

Итак, чтобы выбрать первое (случайное) имя пользователя и нажать Option-Return, введите конкретное имя пользователя, нажмите Return и введите пароль:

sudo osascript -e 'сказать приложение "Системные события" код ключа 125 возврат нажатия клавиши, используя опцию вниз нажатие клавиши "имя пользователя" задержка 1,0 возврат клавиши задержка 1,0 нажатие клавиши "пароль" задержка 1,0 возврат клавиши конец сказать

Выше показана некоторая ошибка, которая, насколько я могу судить, не ограничивает использование:

osascript [285]: 3891612: (connectAndCheck) Ненадежные приложения не являются  разрешено подключаться или запускать Window Server до входа в систему. _RegisterApplication (), НЕ удалось установить соединение по умолчанию с WindowServer, _CGSDefaultConnection () имеет значение NULL.

В качестве альтернативы используйте скрипт для конкретного языка из « Сценарий окна входа в систему через Apple Remote Desktop » (возможно, однажды комментарии на этом сайте покажут лучшее решение):

расскажите процесс "SecurityAgent" установить значение текстового поля 1 группы 1 окна 1 равным «имени пользователя» установить значение текстового поля 2 группы 1 окна 1 равным «паролю» конец сказать нажмите кнопку «Войти» в окне 1 процесса приложения «SecurityAgent»

Но главная проблема в том, что для этого еще нужен пароль . Однако: очевидно, что пароль не требуется, когда у пользователя есть пустой пароль. На самом деле, для пустых паролей достаточно просто щелкнуть значок пользователя. Итак, если отправка нажатий клавиш с помощью AppleScript является приемлемой, то, возможно, «все», что осталось выяснить:

  • Можно ли временно удалить пароль пользователя, чтобы разрешить запуск (или возобновление) сеанса, не зная этого пароля ...?

  • Можно ли сделать AppleScript защищенным от ошибок? Подобно:

    • Как сказать, если окно Логин виден? (возможно, stat -f%Su /dev/consoleможет помочь, так как это дает,root пока отображается окно входа в систему)
    • Как узнать, какое окно входа отображается? (Например: один показывает значки и имена для входа, или выпадающий список, или, может быть, только запрос пароля, если кто-то выбрал переключение на какого-то конкретного пользователя?)
    • Избавиться от задержек.
    • Как насчет этого сообщения об ошибке?

(Примечание для тестирования: при использовании общего доступа к экрану кажется, что установка предпочтения При управлении компьютерами: шифрование паролей и нажатий клавиш также сохраняет соединение только при отображении окна входа в систему или после успешного входа пользователя в систему. При использовании шифрования всей сети данные затем мой Mac необходимо повторно установить соединение совместного использования экрана каждый раз, когда Войти отображаются или пользователь коммутируемый.)

Это хорошее начало, но у него есть две проблемы. Во-первых, он не работает, если вы находитесь в окне входа в систему, что я и хотел, и запрашивает пароль, но я бы предпочел, чтобы он этого не делал. Так как это root, он должен иметь возможность переключать пользователей без пароля. Sophie Alpert 14 лет назад 0
Ага. Я даже не знаю, как войти в систему как другой пользователь, сидя за самим компьютером, поэтому никакая сигара для `sudo osascript -e 'не скажет приложению" Системные события "нажать клавишу" пароль "и вернуть "`. При заблокированном экране ввод имени пользователя и пароля администратора * возобновляет * сеанс другого пользователя. Но как * запустить * сеанс для любого пользователя, не зная пароля? (Просто чтобы быть уверенным, если вы знаете пароль: другой обходной путь может быть Screen Sharing, который также работает для экрана входа в систему. Вам потребуется повторно подключить Screen Sharing после запуска или возобновления определенного сеанса пользователя.) Arjan 14 лет назад 0
Это хорошо. Я бы предпочел решение без ручной симуляции нажатия клавиш. Sophie Alpert 14 лет назад 0
Интересно, кто-нибудь знает, как начать сеанс для кого-то другого? Таким образом, без учета приведенного выше ответа, просто при ежедневном использовании Mac OS X: ** может ли администратор войти в систему как другой пользователь, не зная пароля этого пользователя? ** (Как и `su` в командной строке, но затем для сеанса с графическим интерфейсом. Или, как при заблокированном экране, когда ввод имени пользователя и пароля администратора * возобновляет * сеанс другого пользователя.) Arjan 14 лет назад 2
Возможно, это невозможно сделать без нажатия клавиш AppleScript: http://docs.info.apple.com/article.html?path=RemoteDesktop/3.0/en/ARDC869.html Sophie Alpert 14 лет назад 0
Хм, хорошая находка, эта статья! Если AppleScript и нажатия клавиш приемлемы, то, возможно, нам следует продолжить квест, а затем найти способ временно очистить пароль. Arjan 14 лет назад 0
Я бы определенно предпочел решение, которое не требует поддельного нажатия клавиш. Sophie Alpert 14 лет назад 0
Окидоки, тогда я не могу вам помочь. Arjan 14 лет назад 0
1
Nicholas Wilson

Я расследовал это недавно.

Поместите это в стек PAM вашего приложения или протестируйте с помощью sshd:

session required pam_launchd.so launchd_session_type=Aqua 

Это имеет большое значение для получения графического сеанса, который довольно близок к отключенному сеансу пользователя. В частности, он находится в правом пространстве имен начальной загрузки и имеет правильные порты начальной загрузки (я думаю). Вы можете проверить источник, что делает pam_launchd; он использует некоторую разумную частную библиотеку (функции vproc_priv.h в libvprop) для вызова подпрограмм Маха для настройки портов и пространства имен. Он соответствует всем (ограниченным) документам, предоставляемым Apple для системных вызовов, полученных из Маха.

Затем вам нужно установить для идентификатора пользователя аудита значение идентификатора пользователя с API-интерфейсом BSM, иначе окно входа в систему не будет общаться с вами в Lion.

Сеанс выглядит очень близко к отключенному сеансу сейчас, если вы проверите «launchctl blist», и некоторые процессы и сервисы прекрасно оживают (например, монтажная панель и т. Д.). На самом деле все, кроме Finder и loginwindow работает. До тех пор, пока не будет запущено loginwindow, вы не сможете запустить графическое приложение, и процесс loginwindow за сеанс всегда будет порождаться как прямой потомок глобального. Как можно проткнуть процесс loginwindow, чтобы запустить новое loginwindow в новом сеансе? Я не могу найти способ получить последний кусок на месте!

Любая помощь в завершении этого ответа с благодарностью получена.

0
zeigerpuppy

Выполнение команды с помощью sudo позволяет установить сценарий на нечитаемый для обычных пользователей. Это не идеально, но если ваш админ-пользователь уже взломан, игра окончена!

chmod ur имя скрипта

Мой скрипт выглядит так, он работает удаленно, когда один пользователь уже запущен, чтобы переключиться на другого пользователя через SSH (протестировано на 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
William H. Hooper

Мне нужно было зарегистрировать одного и того же пользователя на 25 разных рабочих станциях, чтобы выполнить обновление программного обеспечения. Я не смог выполнить команду «osascript -e ...» надежно из сеансов SSH, даже с привилегиями sudo. Однако я смог запустить его через Apple Remote Desktop. Если у вас есть ARD:

  1. выберите свои машины
  2. разбудить их и выйти из системы других пользователей, если это необходимо
  3. выберите «Отправить команду UNIX ...» из меню «Управление»
  4. вставьте скрипт Арджана (без слова «sudo») в диалоговое окно команды
  5. выберите и введите «Выполнить команду как: пользователь: root»

Я был рад найти всех 25 Mac Minis, работающих под Finder, менее чем за минуту. Еще раз повторю: с 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'