Я просто хочу знать, можно ли это сделать одной командой без каких-либо взаимодействий в 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
также не может удовлетворить мои требования, потому что они также делают скриншоты рабочего стола текущего пользователя.
Вы можете задаться вопросом, почему я хочу этого. На самом деле мне не нужны скриншоты, мне нужна безопасность. Я хочу сделать оболочку этого другого пользователя полностью изолированной от текущего пользователя, чтобы любой вредоносный код, работающий в этой оболочке, не смог сделать скриншот текущего пользователя.
Рабочий стол управляется демоном WindowServer.
Связь с WindowServer защищена, так что только root и текущий пользователь консоли могут получить доступ к WindowServer.
Поскольку вы используете sudo, у вас есть привилегии root для связи с WindowServer.
В дополнение к этому текущее пространство имен используется для определения того, какой рабочий стол является «вашим рабочим столом». Пространство имен сеанса создается для каждого вошедшего в систему пользователя.
Когда вы используете команду входа в систему, вас попросят ввести пароль. На самом деле этим занимается подсистема PAM. В рамках стандартной настройки PAM в macOS вы переноситесь в правильное (ваше собственное) пространство имен сеанса при входе в систему с правильным паролем.
Поэтому, когда вы используете «логин» и вводите пароль, вы получаете снимок экрана рабочего стола этого пользователя, потому что вы находитесь в правильном пространстве имен.
Однако, когда вы используете «login -f», вы обходите PAM. Поэтому модули PAM никогда не выполняются, и вы остаетесь в том же пространстве имен, что и раньше.
Поэтому при использовании «login -f» для создания снимка экрана вы фактически получаете снимок экрана текущего пользователя, а не пользователя «abc», которого вы хотите.
Подробнее об этом можно прочитать в техническом примечании TN2083:
без холма
screencapture
захватывает текущий видимый экран, независимо от пользователя, вошедшего в систему через Терминал. Какую проблему вы пытаетесь решить здесь? Можете ли вы описать его, не делая пока предположений о решении?Чжэньчжэнь Жань
screencapture
захватывает экран другого пользователя в режимеlogin
, но захватывает текущий видимый экран в режимахsu -u
,sudo -u
, илиlogin -f
. Но сначала вам нужно использовать пользовательский интерфейс, чтобы войти в систему для этого пользователя, а затем переключиться обратно (не выйти), чтобы скрыть его рабочий стол. Я изменил описание, чтобы уточнить.