用于检测NAS是否已连接的脚本,如果已连接,则安装共享

时间:2014-08-05 13:29:47

标签: macos applescript daemon nas afp

我试图找到一种在我的NAS上自动挂载共享(afp)的方法。我使用登录来控制计算机可以访问哪些共享(出于隐私和其他原因)。切换登录时,不会重新安装所有共享,这会导致我运行的某些应用程序出现问题。

我想要做的是每次登录NAS时都会运行一个脚本(即使它只是访客登录),然后这个脚本会挂载共享。

我想知道是否有人能指出我正确的方向。这是在OS X计算机上,所以考虑使用applescript来实现这一点。

提前致谢

汤姆

2 个答案:

答案 0 :(得分:2)

我多年来一直在我的Mac上解决这个问题,相信我终于有了解决方案。

我把它分成两个脚本:

第一个(在AppleScript编辑器中导出为保持打开的应用程序)在空闲(而不是重复循环)上运行,并且每隔10秒调用第二个脚本来处理驱动器安装。我在第一个脚本中检查的错误非常重要,因为-128确保您仍然可以通过右键单击或osx关闭退出保持打开脚本,而-5014是一个未知错误,除非明确处理,否则会弹出一个对话框我的情况。

--------------------------------------------------------------------------------------
--"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挂载挂载卷。我最初使用的是一个取景器" mount volume"并且该代码作为内联注释存在,但我不喜欢弹出错误的对话框;即使只是一秒钟,所以我转向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
                try
                    do shell script "mkdir /Volumes/work"
                end try

                do shell script "mount_afp afp://xxx.xxx.xxx.xxx/work /Volumes/work/"

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

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

一旦有了它,将第一个脚本/应用程序拖到用户登录项中,以便在登录时自动启动它。如果您不需要持久重新映射,则拖动第二个脚本/应用程序进入一次运行的登录项目。

答案 1 :(得分:1)

基本思路是让launchd代理程序观察文件夹的变化。您将需要观察/ Volumes文件夹,因为当您登录NAS时,某些内容将被装入Volumes文件夹。因此,监视代理程序将检测Volumes文件夹中发生更改的内容,并运行脚本。

这很简单。你可以google关于launchd并找到很多例子。但要设置一个监视文件夹,请使用类似的东西......

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>WatchPaths</key>
    <array>
        <string>/Volumes</string>
    </array>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/bin/osascript</string>
        <string>/path/to/applescript</string>
    </array>
    <key>Label</key>
    <string>com.someName.plistFileName</string>
</dict>
</plist>

所以只需使用上面的代码创建一个文本文件。使用“.plist”扩展名保存。在ProgramArguments部分中插入一个指向applescript的路径,并在Label部分为其命名。

将此plist放入〜/ Library / LaunchAgents文件夹并重新启动计算机。现在每次在/ Volumes文件夹中发生变化时,都会运行applescript。

然后你就可以正确地创建苹果。您首先需要检查Volumes文件夹,看看您的NAS是否已安装。如果它然后挂载你想要的任何额外的份额,如果没有,那么什么都不做。您可以谷歌(或搜索堆栈溢出)如何使用applescript挂载共享。

祝你好运。