我已经设置了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
作为这个用户运行我没有遇到任何问题。