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

Я просто хочу знать, можно ли это сделать одной командой без каких-либо взаимодействий в macOS. Есть интерактивный способ сделать это (сначала я переключился на пользователя abc, а затем переключился обратно, чтобы у abc был скрытый рабочий стол):

(in sudo mode)
login abc
(type the password)
screencapture <png-file-name>

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

(in sudo mode)
login -f abc /usr/sbin/screencapture <png-file-name>
OR
login -f abc bash -c "/usr/sbin/screencapture <png-file-name>"

Оба не работают должным образом.

suили sudoтакже не может удовлетворить мои требования, потому что они также делают скриншоты рабочего стола текущего пользователя.

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

Вы уверены в первом предположении? screencaptureзахватывает текущий видимый экран, независимо от пользователя, вошедшего в систему через Терминал. Какую проблему вы пытаетесь решить здесь? Можете ли вы описать его, не делая пока предположений о решении?
Не предположения. Я протестировал их. screencaptureзахватывает экран другого пользователя в режиме login, но захватывает текущий видимый экран в режимах su -u, sudo -u, или login -f. Но сначала вам нужно использовать пользовательский интерфейс, чтобы войти в систему для этого пользователя, а затем переключиться обратно (не выйти), чтобы скрыть его рабочий стол. Я изменил описание, чтобы уточнить.

Ответы (1)

Рабочий стол управляется демоном WindowServer.

Связь с WindowServer защищена, так что только root и текущий пользователь консоли могут получить доступ к WindowServer.

Поскольку вы используете sudo, у вас есть привилегии root для связи с WindowServer.

В дополнение к этому текущее пространство имен используется для определения того, какой рабочий стол является «вашим рабочим столом». Пространство имен сеанса создается для каждого вошедшего в систему пользователя.

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

Поэтому, когда вы используете «логин» и вводите пароль, вы получаете снимок экрана рабочего стола этого пользователя, потому что вы находитесь в правильном пространстве имен.

Однако, когда вы используете «login -f», вы обходите PAM. Поэтому модули PAM никогда не выполняются, и вы остаетесь в том же пространстве имен, что и раньше.

Поэтому при использовании «login -f» для создания снимка экрана вы фактически получаете снимок экрана текущего пользователя, а не пользователя «abc», которого вы хотите.

Подробнее об этом можно прочитать в техническом примечании TN2083:

https://developer.apple.com/library/content/technotes/tn2083/_index.html#//apple_ref/doc/uid/DTS10003794-CH1-SUBSECTION14