美文网首页
使用python批量发送文件到windows服务器

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

作者: Aedda | 来源:发表于2021-03-01 16:47 被阅读0次

    一:配置服务器

    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()
    
    '''如果本文对你有帮助请点赞评论,感谢您的支持'''
    

    相关文章

      网友评论

          本文标题:使用python批量发送文件到windows服务器

          本文链接:https://www.haomeiwen.com/subject/xhyafltx.html