Ubuntu EC2实例中Node.js脚本读取routes.txt遇权限拒绝问题
解决Ubuntu EC2上Node.js读取routes.txt权限拒绝问题
问题描述
在Ubuntu EC2实例运行Node.js项目的db-load脚本时,出现错误:
error: could not open file "/home/ubuntu/express_bus/database/google_transit/routes.txt" for reading: Permission denied
该项目在本地及另一同类型EC2实例部署均无权限问题,db-create脚本运行正常。已尝试修改routes.txt权限(chmod 644、chmod a+r),但问题未解决。文件权限列表如下:
ubuntu@ip-172-31-25-137:~/express_bus/database/google_transit$ ls -l total 98488 -rw-rw-r-- 1 ubuntu ubuntu 276 Nov 5 22:49 agency.txt -rw-rw-r-- 1 ubuntu ubuntu 7677 Nov 5 22:49 calendar.txt -rw-rw-r-- 1 ubuntu ubuntu 13648 Nov 5 22:49 calendar_dates.txt -rw-rw-r-- 1 ubuntu ubuntu 195 Nov 5 22:49 feed_info.txt -rw-rw-r-- 1 ubuntu ubuntu 3686 Nov 5 22:49 merge_stops.txt -rw-r--r-- 1 ubuntu ubuntu 5388 Nov 5 22:49 routes.txt -rw-rw-r-- 1 ubuntu ubuntu 23118892 Nov 5 22:49 shapes.txt -rw-rw-r-- 1 ubuntu ubuntu 73698858 Nov 5 22:49 stop_times.txt -rw-rw-r-- 1 ubuntu ubuntu 409676 Nov 5 22:49 stops.txt -rw-rw-r-- 1 ubuntu ubuntu 3570806 Nov 5 22:49 trips.txt
脚本核心调用逻辑:
import client from './client.js'; import { copyTxtFiles, insertBusStopRoutesData } from './dataInsertion.js'; client.connect() .then(async () => { await copyTxtFiles(); await insertBusStopRoutesData(); }) .finally(async () => { await client.end(); console.log('Database connection closed.'); }) .catch((error) => console.error(`Error: client.connect chain: ${error}`)); export default client;
排查与解决步骤
1. 检查目录链的执行权限
读取文件需要路径中每一级目录的执行权限(x),仅文件本身有读权限不够。执行以下命令查看路径每一级的权限:
namei -l /home/ubuntu/express_bus/database/google_transit/routes.txt
确保/home、/home/ubuntu、/home/ubuntu/express_bus等所有父目录对ubuntu用户都有x权限。如果某一级缺少,用chmod u+x <目录路径>补充。
2. 确认Node.js进程的运行用户
如果脚本是以其他用户(比如root)启动的,可能导致权限问题。执行以下命令查看Node.js进程的运行用户:
ps aux | grep node
或者在脚本中添加代码打印当前进程用户:
console.log('Current UID/GID:', process.getuid(), process.getgid());
如果进程不是以ubuntu运行,切换回ubuntu用户执行脚本,或者调整文件权限对进程用户开放读权限。
3. 检查SELinux/AppArmor限制
EC2实例可能启用了SELinux或AppArmor,限制了Node.js的文件读取权限:
- 临时关闭SELinux测试:
如果问题解决,需要配置SELinux规则允许Node.js读取该文件,而不是永久关闭。sudo setenforce 0 - 检查AppArmor状态:
若存在针对Node.js的限制profile,需调整规则或临时禁用对应profile。sudo aa-status
4. 查看文件ACL权限
可能存在额外的ACL权限设置覆盖了基础权限,执行以下命令查看:
getfacl /home/ubuntu/express_bus/database/google_transit/routes.txt
确保输出中ubuntu用户有read权限,若缺少,用setfacl -m u:ubuntu:r <文件路径>添加。
5. 检查文件是否被锁定
极少数情况下,文件被其他进程锁定会导致无法读取,执行以下命令查看:
lsof /home/ubuntu/express_bus/database/google_transit/routes.txt
若有进程占用,停止对应进程后重试。
内容的提问来源于stack exchange,提问作者Edgar Arrizon
相关产品推荐
相关产品推荐

