Ubuntu下以非特权用户通过systemd运行应用服务时遭遇Permission Denied错误
Ubuntu下以非特权用户通过systemd运行应用服务时遭遇Permission Denied错误
看起来你遇到的核心问题是myuser没有权限进入指定的工作目录,咱们一步步排查解决:
先揪出核心错误根源
你看到的Changing to the requested working directory failed: Permission denied,本质是**myuser没有目标目录的「进入权限」**——在Linux里,目录的execute(执行)权限对应「进入该目录」的权限,光设置chown还不够,还得确保权限位正确。另外你之前的chown命令顺序搞错了:chown的格式是用户:组,你写的mygroup:myuser把顺序弄反了,这也可能导致权限归属不对!
一步步修复权限
修正目录的用户组归属
先把目录的所属用户和组改对,执行:sudo chown -R myuser:mygroup /path/to/my/app设置正确的目录权限
给myuser完整的目录访问权,同时保证组权限合理,其他用户无权限:sudo chmod -R u+rwx,g+rx,o-rwx /path/to/my/app解释下权限位:
u+rwx:给所属用户(myuser)读、写、进入目录的权限g+rx:给所属组(mygroup)读、进入目录的权限o-rwx:去掉其他所有用户的权限,更安全
检查父目录的权限
别忽略父目录!比如/path/to这个目录,如果myuser没有进入权限,哪怕子目录权限对了也白搭。执行ls -ld /path/to,确保输出里的权限位给了其他用户(或者mygroup)x权限,比如drwxr-xr-x这种。如果没有,需要给父目录加执行权限:sudo chmod o+x /path/to
为什么加sudo没用?
你尝试给myuser加sudo组、在ExecStart里加sudo的思路走偏了:
- systemd切换到
myuser后执行sudo,但默认sudo需要交互式输入密码,服务环境里没有交互能力,所以必然失败 - 咱们的目标是让
myuser本身就有运行应用的权限,完全不需要sudo来提权,这才是非特权用户运行服务的正确姿势
验证修复效果
先切换到
myuser测试目录访问:sudo su -s /bin/bash myuser cd /path/to/my/app如果没有报错,说明权限已经没问题了
重启服务并检查日志:
sudo systemctl daemon-reload sudo systemctl restart myapp.service journalctl -u myapp.service -f此时应该不会再出现
CHDIR相关的权限错误了
备注:内容来源于stack exchange,提问作者Fei Qu




