You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Node.js应用中的EACCES权限拒绝问题?

Node.js Webhook脚本权限问题排查(EACCES: permission denied)

我编写了一个Node.js脚本webhook_server.js,用于在GitHub代码更新时自动同步AWS服务器上的代码,采用webhooks机制实现。但运行脚本时持续出现以下权限错误:

Error writing to log file: Error: EACCES: permission denied, open '/home/ubuntu/webhook-handler/webhook_server.log'

我尝试过以下命令调整权限,但问题依然存在:

sudo chmod 755 /home/ubuntu/webhook-handler
sudo chmod 644 /home/ubuntu/webhook-handler/webhook_server.log

以下是webhook_server.js的完整代码:

const express = require('express');
const bodyParser = require('body-parser');
const { exec } = require('child_process');
const fs = require('fs');

const app = express();
const port = 3002;
const logFile = '/home/ubuntu/webhook-handler/webhook_server.log';

const log = (message) => {
    const timestamp = new Date().toISOString();
    try {
        fs.appendFileSync(logFile, `${timestamp} ${message}\n`);
    } catch (err) {
        console.error(`Error writing to log file: ${err}`);
    }
};

app.use(bodyParser.json());

app.post('/webhook', (req, res) => {
    log('\n===========================');
    log('Received a webhook event');

    // 验证是否为主分支推送事件
    if (req.body.ref === 'refs/heads/main') {
        log('检测到main分支推送事件');
        // 执行代码更新脚本
        exec('/home/ubuntu/update_code.sh', (error, stdout, stderr) => {
            if (error) {
                log(`执行脚本出错: ${error.message}`);
                return res.status(500).send({ message: '执行脚本出错' });
            }
            log(`stdout: ${stdout}`);
            log(`stderr: ${stderr}`);
                res.status(200).send({ message: '脚本执行成功' });
        });
    } else {
        log('非main分支推送事件');
        res.status(400).send({ message: '非main分支推送事件' });
    }
});

app.listen(port, () => {
    log(`Webhook handler监听在 http://localhost:${port}`);
});

问题原因与解决方法

1. 确认运行Node进程的用户

先搞清楚你用哪个用户启动的Node脚本——如果是root之外的普通用户(比如ubuntu或专门的node用户),必须确保该用户拥有日志文件和所在目录的写入权限。

执行以下命令查看进程所属用户:

ps aux | grep webhook_server.js

2. 修改目录与文件的所有者

如果进程用户不是文件/目录的所有者,执行以下命令修改(假设运行进程的用户是ubuntu):

sudo chown -R ubuntu:ubuntu /home/ubuntu/webhook-handler

3. 验证权限配置

修改所有者后,确认权限是否正确:

ls -l /home/ubuntu/webhook-handler/webhook_server.log
ls -ld /home/ubuntu/webhook-handler

确保输出中所有者为运行Node的用户,且文件具备写入权限(比如-rw-rw-r--)。

4. 可选:改用用户专属日志路径

若不想调整系统目录权限,可将日志文件放到当前用户主目录下,比如~/webhook_server.log,默认就拥有写入权限。

额外注意事项

  • 如果你用PM2、systemd等工具管理Node进程,要确认服务配置中指定的运行用户是否正确。
  • 避免直接用root用户运行Node脚本,存在安全风险,建议创建专门的node用户来运行服务。

内容的提问来源于stack exchange,提问作者SirBT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 08:12:46