当前位置: 首页 > news >正文

在执行部署脚本后,通过 ls -la 命令查看远程服务器文件时,显示的文件所有者是 games 而不是预期的 root 用户

远程服务器用户显示问题分析

问题描述

在执行部署脚本后,通过 ls -la 命令查看远程服务器文件时,显示的文件所有者是 games 而不是预期的 root 用户。

# 终端显示结果
drwxr-xr-x. 3  501 games  57 815 15:03 .
drwxr-xr-x. 3 root root   20 811 09:44 ..
drwxr-xr-x. 2  501 games  86 815 15:03 assets
-rw-r--r--. 1  501 games 453 815 15:03 favicon.svg
-rw-r--r--. 1  501 games 462 815 15:03 index.html

原因分析

1. UID/GID 映射问题

本地文件系统
rsync 传输
远程文件系统
本地 UID: 501
传输过程
远程 UID: 501
远程系统查找
UID 501 对应用户
显示为 games 用户
部署脚本配置
REMOTE_USER=root
SSH 连接用户
文件传输权限

2. 具体原因

A. 文件所有权保持
  • rsync 行为:默认情况下,rsync 会尝试保持文件的原始 UID/GID
  • 本地 UID:本地文件的 UID 是 501(通常是 macOS 用户的默认 UID)
  • 远程映射:远程服务器上 UID 501 对应的用户是 games
B. 用户映射差异
# 本地系统(macOS)
UID 501 = 当前用户# 远程系统(Linux)
UID 501 = games 用户
UID 0   = root 用户
C. rsync 权限处理
  • 虽然使用 root 用户连接,但 rsync 保持了原始文件的 UID
  • 远程系统将 UID 501 解析为 games 用户

解决方案

方案一:修改 rsync 参数(推荐)

# 在 deploy.sh 中修改 rsync 命令
sshpass -p "$REMOTE_PASSWORD" rsync -avz --delete --chown=root:root \-e "ssh -o StrictHostKeyChecking=no -p $REMOTE_PORT" \"$LOCAL_DIST_DIR/" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/"

优点

  • 直接在传输时设置正确的所有者
  • 一步到位,无需额外操作
  • 保持部署流程的原子性

方案二:传输后修改所有权

# 在上传完成后添加
sshpass -p "$REMOTE_PASSWORD" ssh -o StrictHostKeyChecking=no -p "$REMOTE_PORT" "$REMOTE_USER@$REMOTE_HOST" \"chown -R root:root $REMOTE_DIR"

优点

  • 灵活性高,可以设置任意用户
  • 不影响传输过程

方案三:使用 --numeric-ids 参数

# 保持数字 UID,不进行用户名映射
sshpass -p "$REMOTE_PASSWORD" rsync -avz --delete --numeric-ids \-e "ssh -o StrictHostKeyChecking=no -p $REMOTE_PORT" \"$LOCAL_DIST_DIR/" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/"

最佳实践建议

1. 生产环境配置

# 推荐的 rsync 配置
RSYNC_OPTS="-avz --delete --chown=www-data:www-data --chmod=D755,F644"

2. 安全考虑

  • 为 Web 应用设置专用用户(如 www-data
  • 避免使用 root 用户运行 Web 服务
  • 设置适当的文件权限

3. 部署流程优化

构建项目
传输文件
设置所有权
设置权限
验证部署
rsync --chown
一步完成

修复建议

基于当前的部署脚本,建议采用方案一,修改 rsync 命令添加 --chown=root:root 参数:

# 修改 upload_files 函数
upload_files() {log_info "上传文件到远程服务器..."# 使用 rsync 上传文件并设置正确的所有者if sshpass -p "$REMOTE_PASSWORD" rsync -avz --delete --chown=root:root \-e "ssh -o StrictHostKeyChecking=no -p $REMOTE_PORT" \"$LOCAL_DIST_DIR/" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/"; thenlog_success "文件上传完成"elselog_error "文件上传失败"exit 1fi
}

这样可以确保上传的文件在远程服务器上显示为 root 用户所有,符合预期的配置。

http://www.dtcms.com/a/333459.html

相关文章:

  • 二、DOCKER常用命令
  • 最长递增子序列-dp问题+二分优化
  • Vue 侦听器(watch 与 watchEffect)全解析1
  • 【161页PPT】智慧方案企业数字化转型概述(课件)(附下载方式)
  • pcl法线估计的踩坑
  • 【GPT入门】第47课 大模型量化中 float32/float16/uint8/int4 的区别解析:从位数到应用场景
  • 《P1194 买礼物》
  • PyTorch的安装-CPU版本或者GPU安装有什么区别吗
  • 口播数字人免费API调用方案
  • Docker的相关知识探究详解
  • 【功能更新】“弹性互联网”正式上线Fusion WAN平台
  • Oracle按照特定列值排序和C#统计特定列值的所有行
  • 数据结构:N叉树 (N-ary Tree)
  • 【部署K8S集群】 1、安装前环境准备配置
  • Deepoc具身智能模型如何重塑康复辅助设备
  • Java中MybatisPlus使用多线程多数据源失效
  • 集成电路学习:什么是Image Segmentation图像分割
  • 功能组和功能组状态的概念关系和区别
  • java16学习笔记-Vector API
  • oracle数据库初始化
  • 共探头部设计|安贝斯携手武汉科创协会x深钣协“湖北行”,链动D+M小镇的华中范式
  • Linux软件编程-进程(2)及线程(1)
  • 快速设计简易嵌入式操作系统(5):贴近实际场景,访问多外设,进一步完善程序
  • WPF 监控CPU、内存性能
  • python math数学运算模块
  • 【AI论文】Story2Board:一种无需训练的富有表现力故事板生成方法
  • Numerical Difference between vLLM logprobs and huggingface logprobs
  • windows下hashcat使用gpu破解execl打开密码
  • 深入Amazon DynamoDB:高效、无缝的数据存储解决方案
  • 项目生命周期