在 Mac OS X 启动时运行 `sudo` 命令

在 Mac OS X 启动时运行 `sudo` 命令

如何sudo在 Mac 启动时运行命令行?

具体来说,我试图在 Mountain Lion 上运行以下命令:

sudo ipfw add 100 fwd 127.0.0.1,8080 tcp from any to any 80 in

还有其他关于在启动时运行命令行工具的问题(例如),但它们没有解决sudo所需的管理员权限/密码的问题。

其他问题与解答讨论launchd,但这似乎是针对需要监视并在崩溃时重新启动的守护进程。相比之下,我只是尝试一次性完成,在启动时运行该行一次。

如果这些年来情况发生了变化,那么在旧版本的 Mac OS X(例如 Mountain Lion)以及新版本(例如 Yosemite/El Capitan)上启动时运行 sudo 会很好。

答案1

尽管 launchd 和 LaunchDaemon 听起来像守护进程,但它是实现一切自动化的首选方式。苹果在其文档中表示,

登录和注销脚本是一种弃用的技术。在大多数情况下,您应改用 launchd 作业,如创建启动守护程序和代理中所述

登录和注销脚本是应该运行一次然后结束的脚本。它们由登录窗口触发。

我认为将您的命令放入 launchd plist 文件中是正确的方法。首先,您可以排除启动代理,因为它们将始终以用户身份运行。因为您希望脚本以 root 身份运行,所以您应该将其放在/Library/LaunchDaemons/System/Library/LaunchDaemons也可以工作但系统......)下并添加标志RunAtLoad但不要设置KeepAlive(或将其设置为类似崩溃的内容,请参阅这个好的文档)。

编辑因为脚本是以 root 身份运行的,所以你可以省略sudo,另一个选项是创建一个脚本,并将其包含在/etc/sudoersvisudo)中,并使用nopasswd标志并以用户身份运行

答案2

这个问题在 apple.stackexchange.com 上有一些很好的答案

cron可能是最容易设置的;通过使用@reboot /path/to/scriptcrontab 文件中的特殊条目,您的 cronjob 将仅在启动时运行。关于如何做到这一点的答案在上面链接的问题中。

launchd可能是正确的解决方案。您用它来运行一次性命令和脚本。其他答案之一上面链接的问题中讨论了如何为此编写 PropertyList 文件。请注意,必须将 PropertyList 置于/Library/LaunchDaemonsroot 下才能运行。

相关内容