当我在 Mac 上连接到互联网时自动运行脚本

当我在 Mac 上连接到互联网时自动运行脚本

可能重复:
在网络连接上在 OS X 10.6 中运行脚本。(如 /etc/network/if-up.d/)

我设置了 ssh 隧道,这样我就可以通过我们的网关访问工作中的各种计算机。问题是,我不喜欢每次打开计算机或连接/断开互联网时都必须设置这些隧道,所以我希望有一种方法可以让我每次连接到互联网时都自动运行 shell 脚本来设置隧道。我在办公室的工作站上设置了类似的东西,它运行的是 Ubuntu,它使用 /etc/network/if-up.d 和 if-down.d。Mac 上有类似的设置吗?

答案1

我认为上下文感知工具比如马可波罗可以解决问题,当然如果你使用一些 shell 脚本来设置隧道:

灵活的基于规则的模糊匹配:

  • [...]
  • 分配的 IP 地址
  • 主动网络链接
  • 可见 WiFi 网络

通过改变上下文(进入或离开)触发的操作,带有可选的延迟:

  • [...]
  • 安装网络共享(smb://、afp:// 等)
  • 更改 OS X 网络位置
  • 退出应用程序
  • 运行 shell 脚本(或任何其他类型的脚本,通过鸭嘴兽
  • 建立或断开 VPN

答案2

不是内置的;这类事情通常由 OS X 上的 launchd 处理,但网络开启/关闭事件不在其触发器列表中。幸运的是,pymacadmin 的源码包括一个提供此功能的程序 crankd。 这里是一个使用 crankd 执行类似操作的示例(尽管他使用它来启动 Python 模块而不是 shell 脚本,因此细节略有不同)。我还没有尝试过,但看起来你只需要创建一个 crankd plist 文件,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>SystemConfiguration</key>
    <dict>
        <key>State:/Network/Global/IPv4</key>
        <dict>
            <key>command</key>
            <string>/usr/local/libexec/networkchangescript</string>
        </dict>
    </dict>
</dict>
</plist>

...然后写入 /usr/local/libexec/networkchangescript 来检测网络是否已启动(AIUI 它会针对任何更改启动,无论是启动、关闭还是横向),并在适当的情况下设置隧道。最后,创建一个 launchd plist 来运行 crankd(有关详细信息,请参阅我链接的示例)。

相关内容