Python实时更新Windows文件到Linux/unix主机上,并将回车符"\r\n"全部替换成"\n"

发布时间 2023-03-29 14:49:30作者: 小鱼圆又圆

为什么要这个脚本

习惯了在Windows上用JetBrain 的 PyCharm 社区版,而社区版没有远程编程的功能,所以用这个脚本实现远程编程。

把脚本的换行符替换掉,是因为\r\n在unix下会让Python脚本拥有执行权限时报错。

具体脚本

需要安装paramiko包

首先将文件的\r\n转换成\n放入临时文件,然后上传该临时文件到服务器,再删除临时文件

接口参数:

函数名:keep_update

参数名 含义 类型
ip 主机ip地址 字符串
name 用户名 字符串
password 密码 字符串
f2t

本机文件路径为键、目标主机路径为值的字典,

用于确定要更新的文件

字典

 

import paramiko
import os, time
from tempfile import NamedTemporaryFile


def update(addr, usr, pasw, fn, target_path):
    # 首先把回车符改掉,放进一个临时文件
    tmpf = NamedTemporaryFile(mode='wb', delete=False)
    tmpf.write(open(fn, 'rb').read().replace(b'\r\n', b'\n'))
    name = tmpf.name
    tmpf.close()

    # 上传临时文件
    trans = paramiko.Transport((addr, 22))
    trans.connect(username=usr, password=pasw)
    sftp = paramiko.SFTPClient.from_transport(trans)
    sftp.put(name, target_path)
    # 删除临时文件
    os.remove(name)


def keep_update(addr, usr, pasw, fn2target_paths, if_stop=None, call_back=None):
    last_modified_times = {i: None for i in fn2target_paths}
    while True:
        for i in fn2target_paths:
            modified_time = os.stat(i).st_mtime
            if (not last_modified_times[i]) or modified_time > last_modified_times[i]:
                last_modified_times[i] = modified_time
                update(addr, usr, pasw, i, fn2target_paths[i])
                print(i+':', time.asctime())
                if call_back: call_back()
                if if_stop and if_stop[0]: break
        time.sleep(0.2)


if __name__ == '__main__':
    f2t = {
    'fn1': 'target_fname',    
}

    keep_update(ip, name, password, f2t)