使用python批量发送文件到windows服务器

2021-03-01  本文已影响0人  Aedda

一:配置服务器

  1. 下载
    主程序: freeSSHd.exe
    辅助程序 生成配置用如果自己设置的话就不用下载这个了,教程中不用这个:freeUserImport.exe
  2. 安装freeSSHd一路下一步,两个Setup提示点否
  3. 双击安装好的freeSSHd,在电脑右下角的后台程序里打开
  4. 这个目录就是在代码中服务器的根目录,设置途中不要点确定与应用

    1位置:开放的ip端口,0.0.0.0是使用的服务器公网ip
    2位置:cmd的路径,用于远程执行命令
    3位置:勾选就完事了
    4位置:密钥,用于认证,点New生成即可


    这里的账号密码就是在代码中链接要用到的账号密码


    两个都变绿就完事了,确定让它后台运行着
    这里要注意:如果你不能启动,那要在任务管理器里面杀掉所有freesshd进程,再服务中停止freesshd服务,之后在启动就行了。

二:上代码

# coding: utf-8
``` 发送当前文件所在文件夹的所有文件与文件夹到服务器设置的根目录 ```

import paramiko
import re
import os
import datetime
from multiprocessing import Process
import multiprocessing


class Distribution:
    def __init__(self, local_path: str, user: dict, exclude: list):
        self.start_time = datetime.datetime.now()
        self.local_path = local_path
        self.ssh, self.sftp = self.get_sftp(**user)
        self.exclude = exclude

    def get_sftp(self, ip, port, username, password):
        transport = paramiko.Transport((ip, port))
        transport.connect(username=username, password=password)
        sftp = paramiko.SFTPClient.from_transport(transport)  # 如果连接需要密钥,则要加上一个参数,hostkey="密钥"
        ssh = paramiko.SSHClient()
        ssh._transport = transport
        return ssh, sftp

    def get_path(self, root_dir):
        list_dirs = os.walk(root_dir)
        for root, dirs, files in list_dirs:
            for i in self.exclude:
                try:
                    dirs.remove(i)
                except:
                    pass
            for d in dirs:
                yield os.path.join(root, d)
            for f in files:
                yield os.path.join(root, f)

    def main(self, ip):
        for cmd in ['chrome','chromedriver']:
            '''kill掉服务器上的这两个程序'''
            self.ssh.exec_command(f'taskkill /im {cmd}.exe /F')
        for local_path in self.get_path(self.local_path):
            remote_path = local_path.replace(self.local_path, "")
            if os.path.isfile(local_path):
                self.sftp.put(local_path, remote_path)
            elif os.path.isdir(local_path):
                try:
                    self.sftp.mkdir(remote_path)
                except:
                    pass
            else:
                print(f'{ip}啥也不是:{local_path},{local_path.replace(self.local_path, "")}')
        self.sftp.close()
        self.ssh.close()


def main(queue, exclude):
    while not queue.empty():
        ip = queue.get()
        # 我到这里使用了统一的用户名密码和端口
        user = {
            'ip': ip,
            'port': 22,
            'username': '设置的用户名root',
            'password': '设置的密码******',
        }
        try:
            D = Distribution(os.getcwd(), user, exclude)
            D.main(ip)
            print(f'{ip}    用时:{(datetime.datetime.now() - D.start_time).seconds}    队列剩余:{queue.qsize()}')
        except Exception as e:
            print(f'{ip}    队列剩余:{queue.qsize()}   出错:{e}')

if __name__ == '__main__':
    queue = multiprocessing.Queue(50)   # 队列容量
    ip_ls = [
    '127.0.0.1','192.168.0.1'
    ]  # 服务器ip
    exclude = ['__pycache__', '.git', '.idea', 'download', 'environment', 'static', 'command']  # 排除的文件夹和文件
    for i in ip_ls: queue.put(i)
    print(f'共{queue.qsize()}个服务器进行更新')
    for i in range(8):  # 8是进程数
        process = Process(target=main, args=(queue, exclude))
        process.start()

'''如果本文对你有帮助请点赞评论,感谢您的支持'''
上一篇下一篇

猜你喜欢

热点阅读