如何解决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
相关产品推荐
相关产品推荐

