You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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把顺序弄反了,这也可能导致权限归属不对!

一步步修复权限

  1. 修正目录的用户组归属
    先把目录的所属用户和组改对,执行:

    sudo chown -R myuser:mygroup /path/to/my/app
    
  2. 设置正确的目录权限
    myuser完整的目录访问权,同时保证组权限合理,其他用户无权限:

    sudo chmod -R u+rwx,g+rx,o-rwx /path/to/my/app
    

    解释下权限位:

    • u+rwx:给所属用户(myuser)读、写、进入目录的权限
    • g+rx:给所属组(mygroup)读、进入目录的权限
    • o-rwx:去掉其他所有用户的权限,更安全
  3. 检查父目录的权限
    别忽略父目录!比如/path/to这个目录,如果myuser没有进入权限,哪怕子目录权限对了也白搭。执行ls -ld /path/to,确保输出里的权限位给了其他用户(或者mygroupx权限,比如drwxr-xr-x这种。如果没有,需要给父目录加执行权限:

    sudo chmod o+x /path/to
    

为什么加sudo没用?

你尝试给myuser加sudo组、在ExecStart里加sudo的思路走偏了:

  • systemd切换到myuser后执行sudo,但默认sudo需要交互式输入密码,服务环境里没有交互能力,所以必然失败
  • 咱们的目标是让myuser本身就有运行应用的权限,完全不需要sudo来提权,这才是非特权用户运行服务的正确姿势

验证修复效果

  1. 先切换到myuser测试目录访问:

    sudo su -s /bin/bash myuser
    cd /path/to/my/app
    

    如果没有报错,说明权限已经没问题了

  2. 重启服务并检查日志:

    sudo systemctl daemon-reload
    sudo systemctl restart myapp.service
    journalctl -u myapp.service -f
    

    此时应该不会再出现CHDIR相关的权限错误了

备注:内容来源于stack exchange,提问作者Fei Qu

火山引擎 最新活动