通过 ExecStart 运行时缺少权限

通过 ExecStart 运行时缺少权限

我已经设置了Shadowsocks-libev并已使用以下 systemctl 服务运行它:

[Unit]
Description=Shadowsocks-Libev Manager Service
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
User=nobody
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
ExecStart=/usr/bin/ss-manager -c /etc/shadowsocks/%i.json

[Install]
WantedBy=multi-user.target

我最近注意到我的 Shadowsocks 配置文件 ( /etc/shadowsocks/manager.json) 具有全局读取权限,因此我将其更改为 600 并确保所有者是nobody.由于某种原因,这会导致进程在启动时无法读取配置文件。

systemctl start [email protected]

ss-manager[1357]: 2018-01-05 11:41:00 ERROR: Invalid config path.

这与我撤销该文件的所有读取权限时看到的错误相同。

但是,如果我从命令行使用完全相同的命令启动shadowsocks,它就可以正常工作:

sudo -u nobody /usr/bin/ss-manager -c /etc/shadowsocks/manager.json

nobody同样,我在使用cat或来读取文件时也没有遇到任何问题less

systemctl当我检查由in启动的进程时,ps它显示它正在运行nobody,并且当进程输出文件时,所有者设置为nobody.为什么无法访问该文件?为什么通过 systemctl 运行它和从终端运行它有区别?

我的问题似乎类似于这个问题,但我的 ExecStart 中没有任何引号,因此该解决方案不适用于我的情况。

答案1

我能够解决这个问题,该问题源于用户特有的东西nobody。但我仍然不完全确定是什么让该用户独一无二。

运行时,nobody我在日志中看到以下输出:

Started Shadowsocks-Libev Manager Service.
ERROR: Invalid config path.
Main process exited, code=exited, status=255/n/a
Failed with result 'exit-code'.

这表明尽管具有必要的权限,但仍无法访问配置文件。

当作为我新创建的其他用户(没有主目录)运行时,我在日志中看到以下输出:

Started Shadowsocks-Libev Manager Service.
ERROR: mkdir: No such file or directory
ERROR: unable to create working directory
Main process exited, code=exited, status=255/n/a
Failed with result 'exit-code'.

这是因为它尝试写入不存在的用户主目录。

shadowsocks然后我创建了一个以其自己的主目录命名的新用户:

# useradd -m -s /usr/bin/nologin shadowsocks

作为这个用户运行我没有遇到任何问题。

相关内容