如何在 OS X 启动时以特定用户身份启动进程?

如何在 OS X 启动时以特定用户身份启动进程?

我想在启动时(而不是登录时)以特定用户身份运行脚本。我以为 launchd LaunchDaemon 可以做到这一点,但“man launchd”显示:

“如果您希望您的服务以某个用户的身份运行,那么在该用户的环境中,使其成为 launchd 代理是 Mac OS X 上实现此目的的唯一支持方式。换句话说,在 Mac OS X 上执行 setuid(2) 不足以成为真正意义上的用户。”

他们不是在开玩笑——当我尝试将脚本作为 LaunchDaemon 运行时,它不起作用。特别是,我尝试使用“security”命令自动执行一些钥匙串操作,当我通过 LaunchDaemon 运行脚本时,它不允许我更改默认钥匙串,尽管从 shell 使用 sudo 运行时脚本运行良好。

LaunchAgent 不起作用,因为目标是在没有用户登录的情况下运行进程,而 LaunchAgents 仅在有人登录时运行。我查看了 cron 和 @reboot 指令,看起来很有希望,但我读到 cron 在 OSX 上已被弃用。

答案1

我在尝试让长时间运行的进程使用默认钥匙串时也遇到了类似的问题。本质上,LaunchAgent 似乎无法在完整的登录环境中运行以执行安全命令,因此更改默认钥匙串不起作用,并且会返回目录权限错误/Library/Preferences/

秘诀是添加:

<key>SessionCreate</key>
<true/>

到您的 plist。这是一个未记录的功能,它将强制使用适当的环境并允许您设置默认钥匙串。归功于约恩松这个问题为我指明了正确的方向。

答案2

保存为全局守护进程(/Library/LaunchDaemons)并使用键指定用户UserName

<key>UserName</key>
<string>Put username here</string>

答案3

其他一些地方您可以在 OS X 中隐藏启动项(其中大部分完全不受支持)。我会尝试/etc/rc.local;我似乎记得在 Panther 中工作,所以它可能现在仍然有效。

相关内容