4

我有后台进程作为登录用户运行,经常尝试挂载 AFP 共享以备份一些数据。如果无法安装共享,则应该忽略它。

在我的脚本(实际上是 bash)中,我通过 AppleScriptmount volume片段安装共享。与mountormount_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 票证和用户钥匙串的凭据,而无需提供密码。

我已经用谷歌搜索并尝试了几个小时,但还没有找到任何解决方案。

4

3 回答 3

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
--------------------------------------------------------------------------------------

第二个脚本检查网络,然后尝试使用 shell 挂载来挂载卷。我最初使用查找器“安装卷”并且代码也作为注释存在,但我不喜欢弹出错误对话框;即使只有一秒钟,所以我继续使用 shell 脚本。

--------------------------------------------------------------------------------------
--"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 社区和谷歌 - 记得转发

于 2014-12-05T20:09:52.660 回答
2

为糟糕的答案道歉。我认为如果您尝试这样的事情,您将不会被对话框所困扰(但您仍然可以让您的脚本响应错误)。

(下面是一个简单的版本。带有用户名/密码的 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. 如果它出现,请忽略它。

我相信这将有助于在终端或 shell 中使用系统事件来终止对话框:

killall NetAuthAgent

或通过 AppleScript:

do shell script "killall NetAuthAgent"

当然,您必须小心不要在身份验证过程中杀死它。

于 2014-03-25T20:50:30.057 回答
2

要挂载驱动器,请制作一个这样的苹果脚本:

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 从终端运行最后一个脚本,则需要授予对终端的可访问性访问权限。

于 2017-05-31T02:28:42.833 回答