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

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测试:
    sudo setenforce 0
    
    如果问题解决,需要配置SELinux规则允许Node.js读取该文件,而不是永久关闭。
  • 检查AppArmor状态:
    sudo aa-status
    
    若存在针对Node.js的限制profile,需调整规则或临时禁用对应profile。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 00:16:00