如何在服务端而非客户端构建rsync同步文件列表?
服务端自定义rsync同步文件列表的实现方案
核心思路
通过rsync的--server模式搭配自定义脚本,从服务端数据库获取当前用户的授权文件列表,替代客户端指定的同步源,实现客户端仅需发起简单拉取命令即可同步指定文件。
具体步骤
编写服务端授权文件查询脚本
创建可执行脚本(例如/usr/local/bin/rsync_get_authorized_files.sh),逻辑如下:#!/bin/bash # 获取当前SSH连接的用户名 CURRENT_USER=$(whoami) # 从数据库查询该用户的授权文件绝对路径(替换为你的实际数据库查询语句) AUTHORIZED_FILES=$(psql -U db_user -d your_database -t -c "SELECT file_path FROM user_authorized_files WHERE username='$CURRENT_USER'") # 输出文件列表,确保每行一个路径 echo "$AUTHORIZED_FILES"赋予脚本执行权限:
chmod +x /usr/local/bin/rsync_get_authorized_files.sh配置SSH公钥的command参数
在服务端用户的~/.ssh/authorized_keys文件中,修改目标公钥的配置行,将command设置为动态生成文件列表的rsync服务端命令:command="rsync --server --sender -logDtprze.iLsfx . \$($(which rsync_get_authorized_files.sh))" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA...参数说明:
--server:启用rsync服务端模式--sender:指定服务端作为文件发送方(对应客户端拉取操作)-logDtprze.iLsfx:对应rsync默认传输的属性保留参数,可根据需求调整\$($(which rsync_get_authorized_files.sh)):执行脚本动态获取授权文件列表,作为同步源
客户端执行同步命令
客户端只需运行以下命令,即可同步服务端生成的授权文件列表:rsync user@hostname:/ destination-dir/注意:这里的
:/是必须的,用于告知rsync服务端使用动态生成的文件列表而非根目录。
注意事项
- 绝对路径要求:脚本输出的文件路径必须是服务端的绝对路径,避免相对路径引发的同步错误。
- 安全控制:确保脚本和数据库查询仅被授权用户访问,避免未授权的文件泄露。
- 参数适配:根据实际同步需求调整
--server后的参数,比如不需要保留某些文件属性时可删减对应参数。
内容的提问来源于stack exchange,提问作者Smally
相关产品推荐
相关产品推荐

