Переключение пароля заставки с помощью скрипта

Я использую довольно старое приложение под названием Proximity для запуска сценариев Apple, когда мой телефон входит и выходит из диапазона Bluetooth моего Mac. Наряду с другими задачами я хочу защитить свой ноутбук, когда телефон выходит из зоны действия (включить заставку и пароль), а затем отключить требование пароля, когда мой телефон вернется в зону действия.

До 10.9

У меня это работало (в основном) в ОС 10.8 и ранее. Когда мой телефон вышел из зоны действия, я мог запустить:

do shell script "defaults -currentHost write com.apple.screensaver askForPassword -int 1"
do shell script "/Users/Chris/Library/Scripts/Proximity/notifyScreensaver"

tell application "System Events"
    set ss to screen saver "Soundstream"
    start ss
end tell

Это notifyScreensaverскомпилированная программа на C, которая заставляет экранную заставку перечитывать настройки требования к паролю (из этого сообщения на форуме ).

Это активирует требование пароля, а затем немедленно запустит заставку. Это было правильное поведение, если мой ноутбук находился в общедоступной среде. Однако, находясь дома, я не хотел вводить пароль каждый раз, когда выходил из комнаты и возвращался через минуту. Итак, добавляем еще один уровень сложности:

do shell script "defaults -currentHost write com.apple.screensaver askForPassword -int 1"
do shell script "/Users/Chris/Library/Scripts/Proximity/notifyScreensaver"

set ssid to getWifiSSID()
if ssid is equal to "RouterName" then
    (* if at home, only enable password requirement without triggering screensaver *)
else
    (* if not at home, lock screen immediately *)
    tell application "System Events"
        set ss to screen saver "Soundstream"
        start ss
    end tell
end if

on getWifiSSID()
    set theWiFi to do shell script "wifi=`/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I | awk '/ SSID/ {print substr($0, index($0, $2))}'`
echo $wifi
"
    return theWiFi
end getWifiSSID

Используя это, когда я дома, мне нужно вводить пароль только в том случае, если мой телефон находится вне зоны действия И если мой компьютер не используется достаточно долго, чтобы вызвать тайм-аут заставки (~ 20 минут).

Когда мой телефон возвращался в зону действия, я запускал:

do shell script "defaults -currentHost write com.apple.screensaver askForPassword -int 0"
do shell script "/Users/Chris/Library/Scripts/Proximity/notifyScreensaver"

Если заставка уже запущена, для разблокировки компьютера все равно потребуется ввести пароль, но пароль не потребуется, если заставка будет запущена позже.

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

В 10.9

Самое значительное изменение, с которым я столкнулся в версии 10.9, происходит, когда пароль и заставка включены, а затем пароль отключен, без какого-либо промежуточного ввода пользователя. Когда я затем возвращаюсь, чтобы разблокировать компьютер, заставка не требует пароля и сразу возвращается на рабочий стол. Тем не менее, клавиатура по-прежнему заблокирована скринсейвером: я могу взаимодействовать с программами с помощью мыши, но любые нажатия клавиш вызывают только звуковой сигнал предупреждения («фанк» из стандартных предупреждений).

Минимальный пример, вызывающий такое поведение:

do shell script "defaults -currentHost write com.apple.screensaver askForPassword -int 1"
do shell script "/Users/Chris/Library/Scripts/Proximity/notifyScreensaver"

tell application "System Events"
    set ss to screen saver "Soundstream"
    start ss
end tell

delay 5

do shell script "defaults -currentHost write com.apple.screensaver askForPassword -int 0"
do shell script "/Users/Chris/Library/Scripts/Proximity/notifyScreensaver"

Основной способ, который я обнаружил, чтобы выйти из этого полузаблокированного состояния, — это повторно включить требование пароля и повторно запустить заставку, а затем ввести пароль вручную.

Самым идеальным поведением (на мой взгляд) было бы заблокировать мой компьютер, как только мой телефон выйдет из зоны действия, а затем автоматически разблокировать его (без необходимости ввода пароля), когда мой телефон вернется в зону действия. Однако, начиная с более ранних версий ОС, я работал, исходя из предположения, что для разблокировки компьютера требуется ввод данных пользователем после включения заставки и пароля. С этим ограничением желаемое поведение состоит в том, чтобы просто восстановить функциональность, которая присутствовала до версии 10.9, — возможность ввести пароль, чтобы разблокировать компьютер, когда он снова окажется в пределах досягаемости, но не запрашивать пароль снова, пока телефон не выйдет за пределы досягаемости.

Любые предложения о том, как это сделать?

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

Ответы (1)

То же самое происходит со мной в 10.9. Я также попытался изменить require password to wake of security preferencesи перевести дисплеи в спящий режим вместо запуска заставки:

tell application "System Events"
    set require password to wake of security preferences to true
    --start screen saver "Random"
    do shell script "pmset displaysleepnow"
    delay 5
    set require password to wake of security preferences to false
end tell

Хотя ни один из них не помог.

Однако вы можете выйти из системы на экран быстрого переключения пользователей вместо блокировки экрана:

/System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -suspend
Это pmset displaysleepnowполезно, по какой-то причине я не сталкивался с этим в прошлом. Быстрое переключение пользователей, к сожалению, само по себе не позволило бы мне заблокировать компьютер с задержкой, например, когда я выхожу из комнаты на минуту дома.