如何使用WinSCP实现每日自动化从需PPK私钥认证的SFTP服务器拉取文件?
如何使用WinSCP实现每日自动化从需PPK私钥认证的SFTP服务器拉取文件?
别担心,咱们一步步来搞定这个自动化需求,刚好你用的WinSCP本身就支持PPK密钥的脚本化操作,完全不用额外折腾PuTTY,很省心~
第一步:编写支持PPK密钥的WinSCP脚本
你之前的脚本基础很好,只需要在open命令里加个PPK密钥的参数就行,WinSCP原生就能识别PPK格式,不用转成其他密钥格式。给你个修改后的示例脚本,你替换成自己的实际信息就行:
option batch abort option confirm off # 替换成你的SFTP主机、用户名、PPK路径,有密钥口令就加-passphrase open sftp://你的用户名@目标SFTP主机地址 -privatekey="C:\密钥存放路径\你的密钥文件.ppk" -passphrase="你的密钥口令(如果PPK没口令就删掉这部分)" -hostkey="ssh-rsa 1024 xx:d1:fd:0e:c5:xx:de:d7:3c:xx:27:xx:a3:4d:9f:64" # 同步远程/logs目录到本地F:\FTP2,和你之前的命令保持一致 synchronize local F:\FTP2 /logs exit
几个要注意的点:
- HostKey的获取:如果不确定正确的主机密钥,你可以先手动打开WinSCP,用PPK密钥正常登录一次,登录时会提示保存主机密钥,你可以从WinSCP的「会话设置→SSH→主机密钥」里复制正确的指纹,替换脚本里的hostkey内容
- 如果你的PPK文件没有设置口令,直接把
-passphrase="..."这部分删掉就行 - 所有路径要写绝对路径,避免相对路径导致的错误
第二步:编写批处理文件调用WinSCP脚本
WinSCP的脚本需要用它的命令行版本(WinSCP.com)来执行,咱们写一个批处理文件来一键触发:
创建一个新的文本文件,比如命名为每日SFTP拉取.bat,内容如下:
@echo off # 这里替换成你的WinSCP.com安装路径,以及刚才写的脚本路径 "C:\Program Files (x86)\WinSCP\WinSCP.com" /script="C:\脚本存放路径\SFTP拉取脚本.txt" /log="C:\日志路径\WinSCP拉取日志.log"
小提醒:
- 一定要用
WinSCP.com(命令行版本),不能用图形界面的WinSCP.exe /log参数是用来记录每次执行的日志,方便出问题时排查,建议保留
第三步:手动测试脚本(非常重要)
先双击你刚创建的批处理文件,手动执行一次,看看能不能正常拉取文件。如果遇到错误,直接去日志文件里找原因:比如PPK路径写错了、主机密钥不匹配、本地目录权限不足等等,先把手动执行的问题全部解决,再搞定时任务。
第四步:设置Windows任务计划实现每日自动执行
当脚本能正常手动运行后,就可以用Windows自带的任务计划程序来实现每日定时执行了:
- 打开Windows的「任务计划程序」(可以在开始菜单直接搜索这个名称)
- 点击左侧的「创建基本任务」,跟着向导走:
- 任务名称:比如“每日同步SFTP日志文件”,随便起个好记的
- 触发器:选择「每天」,设置你想要的执行时间(比如凌晨2点,避开业务高峰)
- 操作:选择「启动程序」,然后浏览选择你刚才创建的
每日SFTP拉取.bat文件 - 完成向导前,记得勾选「当单击完成时,打开此任务的属性对话框」
- 在属性对话框里,建议再设置两个选项:
- 选择「不管用户是否登录都要运行」:这样就算VM没人登录,定时任务也能正常执行
- 勾选「使用最高权限运行」:避免因为权限不足导致无法写入本地目录或读取密钥文件
一些额外的小提示
- 密钥文件的权限:记得给PPK文件设置严格的权限,比如只允许执行任务的用户读写,右键PPK文件→属性→安全→编辑,删掉其他无关用户的权限,防止密钥泄露
- 如果你的PPK口令很复杂,不想写在脚本里,也可以在WinSCP里用「密钥管理器」把口令存在Windows凭据中,不过脚本里直接写
-passphrase是最直接的方式
备注:内容来源于stack exchange,提问作者Java
相关产品推荐
相关产品推荐

