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

Sco*_*nds 11 startup mac-osx launchd

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

“如果您希望您的服务作为某个用户运行,在该用户的环境中,使其成为启动代理是在 Mac OS X 上完成此任务的唯一支持的方法。换句话说,执行 setuid(2) 是不够的) 成为真正意义上的 Mac OS X 用户。”

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

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

小智 12

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

秘诀是添加:

<key>SessionCreate</key>
<true/>
Run Code Online (Sandbox Code Playgroud)

到你的 plist。这是一个未记录的功能,它将强制一个适当的环境,并使您能够设置默认的钥匙串。感谢joensson关于这个问题指着我在正确的方向。


小智 6

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

<key>UserName</key>
<string>Put username here</string>
Run Code Online (Sandbox Code Playgroud)


Han*_*an5 1

OS X 中还有许多其他位置可以隐藏启动项(其中大多数完全不受支持)。我会尝试/etc/rc.local;我似乎记得在 Panther 工作过,所以它有可能今天仍然有效。