Назад | Перейти на главную страницу

Выйти графического пользователя из командной строки

Просто в основном любопытно.

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

Я могу достаточно легко перезагрузить систему (и, если что-то заблокируется, это может быть оправдано), используя 'sudo reboot' или 'shutdown', но можно ли просто удаленно выйти из системы, как это можно сделать через Apple Remote Desktop?

Редактировать: Есть ли хороший способ сделать это, чтобы они могли сохранить файлы или, возможно, даже отменить выход?

Если вы включите ssh-сервер (удаленный вход в диалоговом окне настроек общего доступа), вы сможете подключиться к Mac по ssh с другого компьютера и выполнить любую команду, которую захотите.

Например: выключение -r сейчас

РЕДАКТИРОВАТЬ:

sudo kill WindowServer

Это приведет к выходу пользователя из системы.

Вы могли бы сделать что-то вроде:

killall -u <username>

Но это действительно грязно. Или просто убейте их процесс входа в систему. Это в значительной степени похоже на то, что у вас есть синий экран окна Windows. Они потеряли бы любую несохраненную работу и т. Д.

Однако я не могу придумать другого способа сделать это более изящно.

Любой пользователь с правами администратора может выйти из системы с помощью launchctl, если это система с версией 10.9.

sudo launchctl bootout gui/$(id -u <username>) разорвет временный сеанс пользователя и вернет систему в окно входа в систему.

Ты можешь видеть launchctl help Чтобы получить больше информации.

Помните, что временный домен пользователя (указанный gui/501 или какой-либо другой идентификатор пользователя) определяется этим идентификатором пользователя, и система не будет сопоставлять имя пользователя с идентификатором пользователя (но id воля).

Хорошей утилитой, которую можно добавить в свой терминал, является команда «выйти из системы», которую можно использовать как:

logout UserName

Вот как:

  1. Отредактируйте свой .bash_profile

    nano ~/.bash_profile

  2. Добавьте эту строку:

    logout() {sudo launchctl bootout user/$(id -u "$1")}

  3. Сохраните файл, нажав ctrl+x

  4. Перезагрузите терминал

Вы готовы к работе;)

Это почти работает:

echo 'tell application "System Events" ^ log out ^ keystroke return ^ end tell' | tr '^' '\n' | osascript

Если вы не против дождаться обратного отсчета таймера окна входа в систему, это проще:

osascript -e 'tell application "System Events" to log out'

Теперь, когда вы можете выйти из системы таким образом (из сеанса SSH), вы получите:

_RegisterApplication(), FAILED TO establish the default connection to the WindowServer, _CGSDefaultConnection() is NULL.

Если вы попытаетесь сделать это с кем-то другим (даже с помощью sudo).

Я не уверен, как убить логин пользователя и позволить ему отменить это действие или сохранить файл, хотя большинство приложений под Lion будут автоматически сохранять. У меня возникла проблема с зависанием заставки под Lion (началось при обновлении до OSX 10.7.4 - см. https://discussions.apple.com/message/18398072) и я с этим справляюсь следующим образом.

SSH в рассматриваемый Mac (это, конечно, предполагает, что вы можете это сделать) и

ps ax | grep [W]indowServer

это даст вам идентификатор процесса WindowServer. затем

sudo kill -HUP *{the PID from the previous command}*

Mac подождет несколько секунд, пока сделает то, что ему нужно, а затем вернет вас обратно к экрану входа в систему.

Найдите их WindowServer или процесс входа в систему:

grep WindowServer

Найдите идентификатор процесса пользователя

sudo kill -9

Предполагается, что вы являетесь администратором их компьютера.

Убийство сервера Windows унесет с собой все его дочерние процессы.

Если вы можете войти в систему как пользователь через SSH, вы можете использовать:

$ alias maclogout="osascript -e 'tell application \"System Events\" to log out' "
$ (sleep 1; maclogout) &

Подождите почти две минуты, прежде чем появится окно входа в систему. В моем тестировании диалоговое окно выхода не появлялось раньше, чем через десять или пятнадцать секунд после подачи команды, затем было 60 секунд ожидания, а затем было время, необходимое для выхода.

Другой альтернативой является подход, указанный в ответе пользователя bmike к вопрос в Apple.StackExchange.com:

sudo pkill loginwindow