Python中如何定时将Windows指定目录下的文件拷贝到Linux服务器

渣渣测试一枚,现在想写一个 python 小脚本,就是定时把一个 win7 上面一个固定目录下的文件拷贝到 linux 上,脚本运行在这个 linux 上面,想了几个库,貌似都不好实现阿,主要是 win7 上面没开启什么服务,有没有简便一点的方法,多谢各位大神指点了。


Python中如何定时将Windows指定目录下的文件拷贝到Linux服务器
31 回复

虚拟机?


这个问题很典型,用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)  # 每分钟检查一次

脚本要点说明:

  1. 连接部分:用了paramiko建立SSH连接,AutoAddPolicy()会自动接受未知主机密钥(生产环境建议更安全的方式)。
  2. 文件传输:通过SCPClient进行文件传输,遍历Windows目录下的每个文件并上传。
  3. 定时机制schedule库让定时设置很直观,这里设的是每天凌晨2点。最后的while循环让脚本持续运行。
  4. 日志记录:加了基础日志,方便追踪运行状态和错误。

运行方式:直接执行这个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 连起来。

十几年前就是这么玩的,简单可靠。

rsync+cwrsync 还是增量备份 哈哈哈哈 楼上的和我说的一样

单向同步,跑个定时任务就行了

samba 或者 U 盘,lol

#18 恰好知道一个不依赖 cygwin 的 sshd
http://www.powershellserver.com/

为什么不从 Win7 上定时运行个 scp 命令,非要从 Linux 上反过来做?

计划任务

回到顶部