2017-08-03 44 views
-1

每当网络发生变化时,我一直试图重新加载pf规则。 这是我的plist文件。 /Library/LaunchAgents/com.wwk.networkchange.plistmacOS Sierra:每当网络发生变化时重新加载防火墙

<?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>Label</key> 
    <string>com.wwk.networkchange</string> 
    <key>ProgramArguments</key> 
    <array> 
     <string>sudo /sbin/pfctl -f /Users/wwk/pf.conf</string> 
    </array> 
    <key>RunAtLoad</key> 
    <true/> 
    <key>WatchPaths</key> 
    <array> 
     <string>/private/var/run/resolv.conf</string> 
    </array> 
</dict> 
</plist> 

我可以看到当网络接口更改,但PF规则不被重新加载在所有/private/var/run/resolv.conf改变。 仅供参考,/Users/wwk/pf.conf在那里,我已启用/ sbin/pfctl通过/ etc/sudoers文件没有密码提示。 非常感谢!

回答

1

我看到至少有两个问题。

首先,您的ProgramArguments需要是一个字符串数组,而不是带空格的单个字符串。

其次,你真的不应该使用sudo这个 - 只需将它作为LaunchDaemon(作为根运行)而不是LaunchAgent(作为登录用户运行)。因此,您ProgramArguments应该是这样的:

<key>ProgramArguments</key> 
<array> 
    <string>/sbin/pfctl</string> 
    <string>-f</string> 
    <string>/Users/wwk/pf.conf</string> 
</array> 
+0

对于ProgramArguments,您是对的。我按照您的指示安排了它们,但仍然没有运气。 关于sudo问题,我发现我仍然必须以sudo作为前缀,即使它已注册为sudoers。 – Pei

+0

@Pei您是否将它移动到/ Library/LaunchDaemons(然后重新启动或使用'sudo launchctl load/Library/LaunchDaemons/com.wwk.networkchange.plist'加载它?这应该使'sudo'无关紧要。 –

+0

是的,我这样做,并做了sudo launchctl加载/卸载几次,但仍然没有运气。 – Pei

0

其实那是因为我的新守护进程是冲突与苹果的默认pfctl的守护进程。 所以我不得不更新默认的pfctl守护进程plist来观察每当网络更改时更改的路径。 添加下面的/System/Library/LaunchDaemons/com.apple.pfctl.plist

<WatchPaths> 
<array> 
    <string>/private/var/run/resolv.conf</string> 
    <string>/etc/pf.conf</string> 
    <string>/Library/Preferences/SystemConfiguration/NetworkInterfaces.plist</string> 
    <string>/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist</string> 
</array> 

顺便说一句,我们必须启用MacOS的恢复模式中系统文件的更改由$ csrutil disable作出上述plist文件的变化。 (必须在系统文件中进行必要的更改后才能执行$ csrutil enable

相关问题