使用 scp 保持文件原始修改时间与权限的关键是加 -p 选项,它保留 mtime、atime 和权限位(不保留所有权);递归需加 -r,即 scp -pr;失效常见原因包括目标文件系统挂载参数或权限不足。

使用 scp 保持文件的原始修改时间与权限,关键在于加上 -p 选项。
scp -p:保留时间戳和权限的核心参数
scp -p 会同时保留文件的修改时间(mtime)、访问时间(atime)以及用户/组所有权之外的权限位(如读、写、执行权限)。注意:它不保留所有权(user/group),除非你以相同用户身份操作且目标系统允许——因为普通用户无法随意设置文件属主。
-
-p是 preserve 的缩写,等价于--preserve=mode,timestamps(在较新 OpenSSH 中行为一致) - 对目录递归传输时,需额外加
-r,即scp -pr - 示例:
scp -pr ./mydir user@host:/backup/—— 递归复制并保留权限与时间
为什么有时 -p 看似没生效?常见原因
即使用了 -p,也可能发现时间或权限“变了”,通常由以下情况导致:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 目标文件系统挂载时启用了
noatime或relatime,导致访问时间(atime)无法还原(但 mtime 不受影响) - 远程用户权限不足,无法设置某些权限位(如 setuid/setgid),SSH 会静默降级处理
- 目标路径已有同名文件,
scp覆盖时可能受 umask 影响(但-p会覆盖 umask 设置的默认权限) - 旧版 OpenSSH(
替代方案:rsync 更精细可控
若需要更可靠地保留所有属性(包括属主、属组、扩展属性、ACL 等),推荐用 rsync:
-
rsync -a --rsync-path="sudo rsync" local/ user@host:/path/(加-a即 archive 模式,包含-rlptgoD) -
-a默认保留权限、时间、符号链接、递归、属主属组(需有对应权限)、设备文件等 - 比
scp -p多出对硬链接、ACL、xattrs 的支持(需双方系统及 rsync 版本支持)
验证是否成功保留
传输后可在两端运行对比命令确认:
- 查看权限与时间:
ls -l --time=modify(显示 mtime)或stat filename - 对比源与目标的输出:
stat file1和stat user@host:file2(支持远程 stat) - 注意:
ls -l显示的是 mtime;如需看 atime/ctime,必须用stat

















