Как подавить / автоматически закрыть диалоговое окно ошибки в AppleScript

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

В моем сценарии (на самом деле bash) я монтирую общий ресурс с помощью фрагмента AppleScript mount volume. В отличие от команд mount или mount_afp, это единственный способ автоматически аутентифицировать пользователя на соответствующем сервере с учетными данными из билета Kerberos или цепочки ключей пользователя. В частности, я не хочу хранить пароль в скрипте:

try
    mount volume "afp://server/share"
on error errText number errNum
    log {errText, errNum}
end try

Обычно это работает нормально, но, несмотря на блок try ... on error, команда 'mount volume' всегда открывает диалоговое окно в случае ошибки:

введите здесь описание изображения

Я ищу :

  • способ подавить этот диалог, или
  • решение для автоматического отклонения его (возможно, с использованием некоторого трюка SystemEvents?), или
  • подход к обучению mount и соответственно mount_afp использованию учетных данных из билета Kerberos и связки ключей пользователя без необходимости предоставления пароля.

Я гуглил и пробовал пару часов, но пока не нашел решения.


person Daniel    schedule 25.03.2014    source источник
comment
Вы также можете попробовать смонтировать его с помощью bash-скрипта, а перед монтированием вытащить пароль из цепочки ключей пользователей. Прочтите это hints.macworld.com/article.php?story=20130722033452283.   -  person jm666    schedule 25.03.2014
comment
@ jm666: Спасибо за подсказку, я забыл о команде security. Однако, учитывая пользовательский процесс, возможность извлекать пароль из цепочки для ключей, ИМХО, лишь немного лучше, чем его непосредственное хранение.   -  person Daniel    schedule 26.03.2014
comment
Возможно, вы неправильно поняли, но когда вы используете команду security, она не запрашивает пароль, когда пользователь разблокировал связку ключей. (обычно он разблокируется во время входа в систему). Таким образом, если пользователь уже зарегистрирован, команда security будет запрашивать только подтверждение для доступа к элементам, а если пользователи нажмут разрешить всегда, больше не будет спрашивать. Таким образом, пароль для монтирования закреплен в цепочке для ключей, его можно вытащить только из разблокированной связки ключей. Но, как я уже сказал, возможно, мой английский недостаточно хорош, чтобы понять проблему ;)   -  person jm666    schedule 26.03.2014
comment
@jm666: Ваш английский в порядке :-) Я хочу сказать, что если я нажму Всегда разрешать, любой скрипт сможет использовать команду security для извлечения пароля пользователя из цепочки для ключей. Это открывает большую дыру в безопасности, поэтому ИМХО решение лишь немного лучше, чем хранить его непосредственно в виде обычного текста.   -  person Daniel    schedule 03.04.2014
comment
Дэниел, связка ключей открыта в любом случае для зарегистрированного пользователя. Таким образом, пользователь имеет права в любом случае видеть свою связку ключей. Вы не можете использовать команду безопасности на разблокированной связке ключей без пароля, поэтому я не вижу никакой дыры в безопасности, потому что, если другой пользователь выполнит команду security, для этого конкретного брелок, он не открывается для него. Просто лучше всего попробовать в реале - не говоря здесь об возможностях и угрозах... :)   -  person jm666    schedule 03.04.2014


Ответы (3)


Я боролся с этой проблемой на своем медиа-сервере Mac Mini целую вечность и считаю, что наконец-то нашел решение.

Я разделил его на два скрипта:

первый работает в режиме ожидания (а не в цикле повторения) и вызывает второй скрипт каждые 10 секунд, который обрабатывает монтирование диска.

--------------------------------------------------------------------------------------
--"On Idle Launch Basic Drive Mounter.app"

on idle
    try
        --script loads on startup, so first we wait 5 seconds to ensure network
        delay 5
        --run the mounter script which is on the desktop
        run script file ":Users:localusername:Desktop:Basic Drive Mounter.app"

    on error errStr number errorNumber
        --listen for the apple quit command and quit
        if the errorNumber is equal to -128 then
            quit
            return 1
        --listen for the unknown error and ignore it
        else if the errorNumber is equal to -5014 then
            return 5
        else
            --all other errors are also ignored
            return 5
        end if
    end try
    --return with a wait of 5 seconds before next idle run
    return 5

end idle
--------------------------------------------------------------------------------------

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

--------------------------------------------------------------------------------------
--"Basic Drive Mounter.app"
try
    set IP_address to "xxx.xxx.xxx.xxx"

    set IP_Valid to true

    try
        do shell script ("ping -c 2 " & IP_address)
    on error
        set IP_Valid to false
    end try

    if IP_Valid then
        tell application "Finder"
            if disk "work" exists then
            else
                -->>shell script version
                try
                    do shell script "mkdir /Volumes/work"
                end try
                do shell script "mount_afp afp://xxx.xxx.xxx.xxx/work /Volumes/work/"
                --<<shell script version
                -->>finder mount volume version
                --with timeout of 1 second
                --  mount volume "afp://xxx.xxx.xxx.xxx/work"
                --end timeout
                --<<finder mount volume version
            end if
        end tell
    end if
on error
    -->>finder mount volume version
    --on error finder returns an error dialog which needs to be closed to go back and  retry
    --tell application "System Events"
    --  keystroke return
    --end tell
    --<<finder mount volume version
    return 0
end try    
--------------------------------------------------------------------------------------

не все это мой собственный код, так что большое спасибо сообществу applescript и Google - не забудьте заплатить вперед

person dunean    schedule 05.12.2014
comment
Спасибо, что поделились этим! Однако это не решает мою проблему с командой mount_afp, которая запрашивает явные учетные данные (имя пользователя/пароль) вместо автоматической аутентификации пользователя на соответствующем сервере с учетными данными из билета Kerberos или цепочки ключей пользователя. - person Daniel; 08.12.2014
comment
@daniel - я использую это против локального NAS, и пользователь, вошедший в OSX, совпадает с пользователем NAS, пароль хранится в цепочке для ключей и работает с mount_afp. Но, конечно, аутентификация Kerberos намного сложнее и, следовательно, может быть проблемой. Вы пробовали другой вариант в коде с нажатием возврата? Хотя и не такой элегантный. - person dunean; 09.12.2014

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

(ниже приведена простая версия. Документация для mount_afp с именем пользователя и паролем находится здесь: http://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man8/mount_afp.8.html )

    try
        alias (POSIX file "/Volumes/yourMountedVolumeName")--hacky check for mount point
    on error
        --does not exist, so make dir
        do shell script "mkdir /Volumes/yourMountedVolumeName"
    end try

    --now use do shell to mount
    try
        do shell script "mount_afp 'afp://yourServer/yourMountedVolumeName/' /Volumes/yourMountedVolumeName"

    on error errText number errnum
        log {errText, errnum}
    end try

[недостаточный ответ ниже]

Что-то из этого может быть очевидным, но вам нужно

  1. следите за этим диалогом (или, очевидно, за успешным монтированием) и
  2. если он появится, отклоните его.

Я считаю, что это сработает, чтобы убить диалоговое окно без обращения к системным событиям... в терминале или оболочке:

killall NetAuthAgent

или через AppleScript:

do shell script "killall NetAuthAgent"

Конечно, вы должны быть осторожны, чтобы не убить его во время процесса аутентификации.

person CRGreen    schedule 25.03.2014
comment
Не могли бы вы уточнить, как выполнить следить за этим диалоговым окном и если оно появится, закрыть его? - person Daniel; 26.03.2014
comment
Спасибо за ваши старания. Однако, как явно описано в вопросе, главное заключается в том, чтобы не передавать пароль, а неявно использовать учетные данные из цепочки ключей пользователя. Это то, что обеспечивает «mount volume» в AppleScript, но, по-видимому, нет сопоставимой команды оболочки («mount» и «mount_afp» требуют пароля). - person Daniel; 03.04.2014
comment
Прошу прощения, но в вопросе говорилось, что вы не хотите хранить пароль в скрипте. Это правда, что вам придется запрашивать и вводить пароль, но вам не нужно будет его хранить. - person CRGreen; 03.04.2014
comment
Извините за путаницу. - person Daniel; 03.04.2014

Чтобы смонтировать диски, создайте сценарий Apple следующим образом:

tell application "Finder"

    try

        mount volume "afp://192.168.0.0/test"

    end try

end tell

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

delay 2
tell application "System Events"
    click UI element "OK" of window 1 of application process "NetAuthAgent"
end tell

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

Если вы запустите этот последний скрипт из терминала, используя osacompile, а затем osascript, вам нужно будет предоставить доступ к терминалу.

person magarnicle    schedule 31.05.2017
comment
Я знаю, что этому несколько лет, но я нахожусь в точно такой же ситуации, и этот ответ мне не помог. Код для закрытия диалога ошибки никогда ничего не нажимает и диалог просто сидит. - person JVC; 09.04.2020
comment
Я давно не использовал этот код, поэтому не знаю, нарушили ли его изменения ОС. Я получил код, используя функцию записи MacOS Automator, а затем очистил полученный код. - person magarnicle; 14.04.2020
comment
Ух ты, отличная идея, я даже забыл, что была функция записи. Я могу поиграть с этим... спасибо! - person JVC; 14.04.2020
comment
Ю.В. Если вы решите это, вернитесь и опубликуйте решение здесь. - person magarnicle; 15.04.2020