launchd设置了错误的用户

时间:2015-03-13 10:45:09

标签: macos launchd

我目前正在使用LaunchDaemons,我遇到了问题,启动显然使用了错误的用户。

这是我的LaunchDaemon的plist(文件名是org.test.user.plist):

<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>org.test.user</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/bash</string>
        <string>/Users/Shared/test_user.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>UserName</key>
    <string>_postgres</string>
    <key>Umask</key>
    <integer>000</integer>
    <key>StandardOutPath</key>
    <string>/Users/Shared/test_user.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/Shared/test_user.log</string>
</dict>
</plist>

这个LaunchDaemon只执行脚本'test_user.sh'。这是脚本的内容:

#!/bin/bash

postbat=/Users/Shared/BatScope4/pgdc/postbat_v1_0

echo "$(date '+%Y-%m-%d %H:%M:%S'):"
echo "user: $USER"
echo "id: $(id)"
echo "umask: $(umask)"
echo "$postbat:"
ls -Al "$postbat"

exit 0

使用

从bash加载LaunchDaemon之后
sudo launchctl load -F org.test.user.plist

日志文件test_user.log包含以下内容:

2015-03-13 11:19:32:
user: _postgres
id: uid=216(_batscope) gid=216(_postgres) groups=216(_postgres),12(everyone),61(localaccounts),402(com.apple.sharepoint.group.1),408(com.apple.sharepoint.group.7),409(com.apple.sharepoint.group.8),403(com.apple.sharepoint.group.2),100(_lpoperator),401(com.apple.sharepoint.group.4),405(com.apple.sharepoint.group.6),404(com.apple.sharepoint.group.3),406(com.apple.sharepoint.group.5)
umask: 0000
/Users/Shared/BatScope4/pgdc/postbat_v1_0:
ls: postbat_v1_0: Permission denied

您需要知道的是,一旦用户(和组)_postgres以UID = 216存在。但是,我删除了它并设置了一个具有以下属性的新用户_postgres:

PrimaryGroupID: 223
RecordName: _postgres
RecordType: dsRecTypeStandard:Users
UniqueID: 223
UserShell: /bin/bash

有没有人知道,为什么launchd继续使用旧用户_postgres以及我如何强迫它不要?

1 个答案:

答案 0 :(得分:0)

经过几个小时的研究和试验后,我发现导致启动的原因是设置了错误的用户。

在文件/etc/master.passwd中,旧的_postgres用户生成了一行。我使用

摆脱了这一行
sudo sed -i '' '/^_postgres.*$/d' /etc/master.passwd

现在launchd挑选了合适的用户。

因此,如果您使用

删除用户
sudo dscl . delete /Users/username

不会删除passwd文件中此用户的条目。必须手动执行此操作以确保用户不会混淆。