我已经设置了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
or读取文件时也没有问题less
。
当我检查由systemctl
in启动的进程时,ps
它显示它正在运行nobody
,并且当进程输出文件时,所有者设置为nobody
. 为什么它不能访问这个文件?为什么通过 systemctl 运行它和从终端运行它有区别?
我的问题似乎与这个问题相似,但我的 ExecStart 中没有任何引号,因此该解决方案不适用于我的情况。
我能够解决这个问题,它源于用户独有的东西
nobody
。不过,我仍然不完全确定是什么让该用户与众不同。当
nobody
我在日志中看到以下输出时运行:这表明尽管拥有必要的权限,但它无法访问配置文件。
当以我新创建的不同用户身份运行时(没有主目录),我在 journald 中看到以下输出:
这是因为它试图写入不存在的用户主目录。
shadowsocks
然后我创建了一个新用户,用它自己的主目录命名:以该用户身份运行我没有遇到任何问题。