首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >WinSCP 的三种同步方式,用错了会删掉服务器上的文件

WinSCP 的三种同步方式,用错了会删掉服务器上的文件

原创
作者头像
PC电脑医生
发布2026-09-20 10:49:22
发布2026-09-20 10:49:22
1010
举报

用 WinSCP 往服务器传文件,拖拽上传就完事了。

但如果要传的是一整个网站目录,一个一个拖就很蠢了——尤其是只改了几个文件的时候。

WinSCP 有三个自动化功能可以解决这个问题。但它们的行为差别很大,选错了会删掉不该删的东西。

先说清楚它们各自做什么。

第一个:同步(Synchronize)

这是手动触发的。

菜单里点一下,WinSCP 扫描本地和远程目录,算出差异,弹出一个清单让你预览——哪些要传、哪些要删。

确认之后才执行。

关键是它有几种模式,行为完全不同:

  • 同步文件:传新文件和改动过的文件
  • 镜像文件:除了传,还会删除远程多出来的文件
  • 同步时间戳:只对时间戳,不传内容

镜像模式的风险

这一项要单独说。

"镜像"的意思是——让远程目录和本地完全一致。

所以它不只是"把本地有的传上去",还会把远程有、本地没有的文件删掉。

这在什么场景下会出事?

设想这个情况:

  • 你本地的工作目录是网站的一部分,只包含你负责的模块
  • 服务器上还有别的同事维护的文件、或者程序运行时生成的缓存和日志
  • 你对着服务器根目录跑了一次镜像同步

结果是:服务器上本地没有的文件,全被删了。

所以镜像模式用之前,必须确认一件事:远程目录里,除了本地这份内容,还有没有别的东西需要保留。

日常发布用"同步文件"就够了。 镜像主要用在"确定两边应该完全一致"的场景,比如部署一份全新副本。

第二个:保持远程目录最新

这个是后台常驻的。

开启之后,WinSCP 会监听本地文件夹的变化。你一保存文件,它就自动把改动传上去。

适合的开发场景:本地改代码,保存即生效,不用手动传。

但它有个性能上的注意点。

WinSCP 检测到变化后,不一定只传那一个文件——它可能会做一次目录整体比对,确保最终状态一致。

如果监控的目录里有大量子目录,这个开销会很明显。

实际建议:

  • 目录数量多(比如几千个),用定时同步,别用这个
  • 只有少量文件需要实时更新,这个才合适

它本质上是个"实时"功能,代价是持续的资源占用。

第三个:命令行脚本

前两个都是在界面上点的。如果要做定时任务,就得用命令行。

WinSCP 自带一个命令行程序(程序名就是 WinSCP.com),配合脚本文件使用。

先写一个脚本文件,比如 sync_script.txt:

代码语言:bash
复制
option confirm off
代码语言:bash
复制
open sftp://用户名:密码@主机地址/
代码语言:bash
复制
synchronize remote "C:\本地目录" "/远程目录"
代码语言:bash
复制
exit

然后调用它:

代码语言:bash
复制
WinSCP.com /script="C:\path\to\sync_script.txt" /log="C:\logs\winscp.log"

配合 Windows 任务计划程序,就能做成每天定时同步。

脚本里几个要点

option confirm off

这一行很重要。 脚本模式虽然默认不弹交互提示,但显式关掉确认更保险——否则某些操作可能因为等待确认而卡住。

synchronize remote

remote 表示本地传到远程。也可以写 local(反方向)或 both(双向)。

/log= 参数

把日志写到文件里。 定时任务跑在后台,出问题的时候你只能靠日志排查。

主机指纹

第一次连接时,如果从没手动连过这台服务器,脚本会因为等待指纹确认而挂起。

处理办法:先在图形界面里连一次并确认指纹;或者在 open 命令里用参数显式指定。

这是自动化脚本最常见的失败原因之一。

顺带说清楚传输模式

传文件时还有个容易踩的坑。

WinSCP 有三种传输模式:

  • 自动:按扩展名判断,文本文件走文本模式,其余走二进制
  • 文本:转换换行符——CRLF 转成 LF
  • 二进制:逐位复制,不做任何转换

默认的"自动"在大多数情况下够用。

但有两个场景要注意:

传图片、压缩包、可执行文件——必须用二进制。

这些文件的内容是精确的字节序列,任何"转换"都会损坏它们。

传文本文件到 Linux——文本模式会帮你把 Windows 的 CRLF 转成 Linux 的 LF。

这本来是好事,但如果脚本本身需要保持 CRLF,转换反而会出问题。

判断依据很简单:这个文件的内容,是不是"文本"?

是文本,转换换行符可能有用;不是文本,一律二进制。

权限那两个数字

传完文件访问不了,或者脚本跑不起来——多半是权限问题。

Unix 权限用三个数字表示,最常遇到的是这两个:

  • 644(含义:所有者读写,其他人只读;用在:普通文件)
  • 755(含义:所有者读写执行,其他人读执行;用在:目录、可执行脚本)

为什么目录要 755?

因为进入一个目录,需要的是"执行"权限。

目录权限没有 x,你连 cd 进去都不行——这也是为什么权限设错时,表现为"打不开"而不是"读不了"。

在 WinSCP 里怎么改:右键文件 → 属性 → 在八进制框里直接输入数字。

也可以在传输设置里配置默认权限,这样上传时自动套用,不用每次手动改。

一句总结

这三个功能解决的是同一个问题——"怎么让两边保持一致"。

但它们的激进程度不同:

  • 保持远程最新:只增改,不动多余文件
  • 同步文件:按差异传输
  • 镜像模式:会删除远程多余文件

从轻到重依次是这三档。 日常用前两档就够,镜像留给确定两边必须完全一致的场景。

用之前先问一句:远程目录里,有没有本地没有但需要保留的东西?

安装包:

https://dubapkg.cmcmcdn.com/cs/257def/WinSCP.exe

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 第一个:同步(Synchronize)
    • 镜像模式的风险
  • 第二个:保持远程目录最新
  • 第三个:命令行脚本
    • 脚本里几个要点
  • 顺带说清楚传输模式
  • 权限那两个数字
  • 一句总结
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档