Python中如何定时将Windows指定目录下的文件拷贝到Linux服务器
渣渣测试一枚,现在想写一个 python 小脚本,就是定时把一个 win7 上面一个固定目录下的文件拷贝到 linux 上,脚本运行在这个 linux 上面,想了几个库,貌似都不好实现阿,主要是 win7 上面没开启什么服务,有没有简便一点的方法,多谢各位大神指点了。
Python中如何定时将Windows指定目录下的文件拷贝到Linux服务器
虚拟机?
这个问题很典型,用Python的schedule库配合paramiko做定时任务就行。核心就两步:建立SSH连接,然后定时执行拷贝。
这里给你一个完整可跑的脚本。你需要先装两个库:pip install schedule paramiko。
import os
import schedule
import time
import paramiko
from scp import SCPClient
import logging
# 配置信息
WINDOWS_DIR = r"C:\Users\YourName\Documents\FilesToCopy" # Windows源目录
LINUX_HOST = "192.168.1.100" # Linux服务器IP
LINUX_PORT = 22
LINUX_USER = "your_username"
LINUX_PASSWORD = "your_password" # 建议改用密钥认证
LINUX_REMOTE_DIR = "/home/your_username/backup/" # Linux目标目录
# 设置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
def copy_files_to_linux():
"""将Windows目录下的所有文件拷贝到Linux服务器"""
try:
# 1. 建立SSH连接
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(LINUX_HOST, port=LINUX_PORT, username=LINUX_USER, password=LINUX_PASSWORD)
# 2. 使用SCP传输文件
with SCPClient(ssh.get_transport()) as scp:
for filename in os.listdir(WINDOWS_DIR):
local_file = os.path.join(WINDOWS_DIR, filename)
if os.path.isfile(local_file):
scp.put(local_file, LINUX_REMOTE_DIR)
logging.info(f"成功拷贝: {filename}")
ssh.close()
logging.info("本次拷贝任务完成")
except Exception as e:
logging.error(f"拷贝过程中出错: {e}")
# 设置定时任务:每天凌晨2点执行
schedule.every().day.at("02:00").do(copy_files_to_linux)
# 保持脚本运行
logging.info("定时拷贝服务已启动,等待执行...")
while True:
schedule.run_pending()
time.sleep(60) # 每分钟检查一次
脚本要点说明:
- 连接部分:用了
paramiko建立SSH连接,AutoAddPolicy()会自动接受未知主机密钥(生产环境建议更安全的方式)。 - 文件传输:通过
SCPClient进行文件传输,遍历Windows目录下的每个文件并上传。 - 定时机制:
schedule库让定时设置很直观,这里设的是每天凌晨2点。最后的while循环让脚本持续运行。 - 日志记录:加了基础日志,方便追踪运行状态和错误。
运行方式:直接执行这个Python脚本,它会一直后台运行。你可以用Ctrl+C停止。
几个关键点:
- 密码写在代码里不安全,正式用建议改成密钥认证。
- 如果文件很多或很大,可能需要考虑增量拷贝或压缩。
- 确保Linux服务器上的目标目录存在且有写入权限。
把这个脚本放在Windows机器上,设置好路径和认证信息,跑起来就行了。
生成 exe,运行
linux 搞个 samba、nfs 服务,共享给 win7 挂载上,然后定时任务( seccopy 这类软件)把 win7 上文件拷贝到这个挂载目录上
先 smb 共享?
Windows 上用 Task Scheduler 就可以把文件复制出去啦
只需要程序跑在 win7 上就好了,ftp 往 linux 上传。
好吧,我再来推广我的 CommandTrayHost
CommandTrayHost 有一个 crontab 功能,可以精确到秒。然后如果装一个 cygwin,那么你可以用 scp 来传文件。
写一个 bat 防如下内容
@ echo off
C:\cygwin64\bin\bash --login -c "cd ~/work; ./upload.sh"
然后写一个 update.sh 内容如下
#!/bin/bash
rsync -rltcv --no-perms --progress --compress -e ssh nginx/nginx.conf nginx/sites-available nginx/snippets [email protected]:/etc/nginx/
然后加一个 CommandTrayHost 的配置如下
{
“name”: “自动上传”,
“path”: “C:\Windows\System32”,
“cmd”: “cmd.exe upload.bat”,
“working_directory”: “D:\bat_script”,
“addition_env_path”: “”,
“use_builtin_console”: false,
“is_gui”: false,
“enabled”: false,
// 可选
“start_show”: false,
“crontab_config”: { // crontab 配置
“crontab”: “5 */6 * * * *”, // 每 6 分钟上传一次
“method”: “restart”, // 支持的有 start restart stop
“count”: 0, // 0 表示不只限制,大于 0 的整数,表示运行多少次就不运行了
},
},
非轮子的话,就直接用 goodsync
同步省事多了
或者用 rclond + 计划任务
你如果用的是 vm 虚拟机,可以直接使用目录映射,在 Linux 里直接访问 windows 的对应目录。
嗯 上面的有个问题 enabled 要改成 true 才能一打开就自动运行。我发现我好像歪题了,赶紧逃<_
#11 更正:rclone
定时 scp 不行么。(我也不知道对不对。。)
如果是两个隔离的机器,你就直接在 win7 上启动一个简单的 httpfileserver 吧,用 python 起一个就行了,或者用别的。
可以不同步,有条件的话,Windows 开共享,Linux 上 smbmount,搞定。
假定 Windows 和 Linux 在同一子网,我用过两种方法:
1. Windows 装 sshd 服务(记不清是否依赖 cygwin 了),Linux 定时用 scp 或 rsync
2. Windows 目录设置共享,Linux 上将该目录用 cifs 挂载到本地。
根据经验,第二种更可靠,不依赖额外的服务。
两边安个 resilio 搞定
在 win 的机器上跑个定时任务做 PSCP 就好了
windows 计划任务 定时跑 rsync 把指定目录 推到 linux 服务器。
不同子网 /公网? openvpn 把 win 和 linux 连起来。
十几年前就是这么玩的,简单可靠。
cwRsync - Rsync for Windows | itefix.net : https://www.itefix.net/cwrsync
rsync+cwrsync 还是增量备份 哈哈哈哈 楼上的和我说的一样
单向同步,跑个定时任务就行了
samba 或者 U 盘,lol
winscp
git?
#18 恰好知道一个不依赖 cygwin 的 sshd
http://www.powershellserver.com/
为什么不从 Win7 上定时运行个 scp 命令,非要从 Linux 上反过来做?
计划任务

