如何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/sudoers
(visudo
)中,并使用nopasswd
标志并以用户身份运行
答案2
这这个问题在 apple.stackexchange.com 上有一些很好的答案。
cron
可能是最容易设置的;通过使用@reboot /path/to/script
crontab 文件中的特殊条目,您的 cronjob 将仅在启动时运行。关于如何做到这一点的答案在上面链接的问题中。
launchd
可能是正确的解决方案。您能用它来运行一次性命令和脚本。其他答案之一上面链接的问题中讨论了如何为此编写 PropertyList 文件。请注意,必须将 PropertyList 置于/Library/LaunchDaemons
root 下才能运行。