paramiko多进程同步目录

近期利用lsync同步发现较慢,所以在脚本后面通过管道来同步文件.

内容如下:

#!/usr/bin/python   
import paramiko  
import os
import sys
import time
import multiprocessing
import datetime
 
ip_list = []
room_id = sys.argv[1]
cur_time = datetime.datetime.now()
 
def Upfile(host_ip,local_path,remote_path):
    privatekey = os.path.expanduser(‘/root/.ssh/id_rsa‘)
    key=paramiko.RSAKey.from_private_key_file(privatekey)
    scp = paramiko.Transport((host_ip, 22))
    scp.connect(username=‘root‘, pkey=key)

    sftp = paramiko.SFTPClient.from_transport(scp)
    src = local_path
    des = remote_path

    os.chdir(os.path.split(local_path)[0])
    parent=os.path.split(local_path)[0]
    for walker in os.walk(parent):
        try:
            sftp.mkdir(walker[0])
            for file in walker[2]:
                sftp.put(os.path.join(walker[0],file),os.path.join(walker[0],file))
                print "execute time is %s and room is %s" %(cur_time,room_id)
                
        except:
            for file in walker[2]:
                sftp.put(os.path.join(walker[0],file),os.path.join(walker[0],file))
    scp.close()

def all_ip():
    f = file(‘/opt/scripts/static_host.txt‘,‘r‘)
    c = f.readlines()
    for x in c:
        ip = x.split(‘\n‘)[0]
        ip_list.append(ip)
    f.close()
 
 
if __name__==‘__main__‘:
    print "-"*50
    print room_id
    if not room_id:
        sys.exit()

    all_ip()
    pool = multiprocessing.Pool(processes=5)
    threads = []
    print "Begin......"
    for i in ip_list:
        room_path = ‘/app/data/ckl/‘+ room_id + ‘/‘
        pool.apply_async(Upfile,(i,room_path,room_path))
    pool.close()
    pool.join()
 
    for res in threads:
        print res.get()

在php执行完成后中加管道来调用此脚本:

 php /app/data/ckl/yiic json notify | sed -n ‘s/^Done: \(.*\)/\1/p‘ | xargs -I {} /opt/scripts/sync_rooms.py {}

下面再贴网上来的一段:

import socket
import os
from stat import S_ISDIR

class SSHSession(object):
    # Usage:
    # Detects DSA or RSA from key_file, either as a string filename or a
    # file object.  Password auth is possible, but I will judge you for 
    # using it. So:
    # ssh=SSHSession(‘targetserver.com‘,‘root‘,key_file=open(‘mykey.pem‘,‘r‘))
    # ssh=SSHSession(‘targetserver.com‘,‘root‘,key_file=‘/home/me/mykey.pem‘)
    # ssh=SSHSession(‘targetserver.com‘,‘root‘,‘mypassword‘)
    # ssh.put(‘filename‘,‘/remote/file/destination/path‘)
    # ssh.put_all(‘/path/to/local/source/dir‘,‘/path/to/remote/destination‘)
    # ssh.get_all(‘/path/to/remote/source/dir‘,‘/path/to/local/destination‘)
    # ssh.command(‘echo "Command to execute"‘)

    def __init__(self,hostname,username=‘root‘,key_file=None,password=None):
        #
        #  Accepts a file-like object (anything with a readlines() function)  
        #  in either dss_key or rsa_key with a private key.  Since I don‘t 
        #  ever intend to leave a server open to a password auth.
        #
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sock.connect((hostname,22))
        self.t = paramiko.Transport(self.sock)
        self.t.start_client()
        keys = paramiko.util.load_host_keys(os.path.expanduser(‘~/.ssh/known_hosts‘))
        key = self.t.get_remote_server_key()
        # supposed to check for key in keys, but I don‘t much care right now to find the right notation
        if key_file is not None:
            if isinstance(key,str):
                key_file=open(key,‘r‘)
            key_head=key_file.readline()
            key_file.seek(0)
            if ‘DSA‘ in key_head:
                keytype=paramiko.DSSKey
            elif ‘RSA‘ in key_head:
                keytype=paramiko.RSAKey
            else:
                raise Exception("Can‘t identify key type")
            pkey=keytype.from_private_key(key_file)
            self.t.auth_publickey(username, pkey)
        else:
            if password is not None:
                self.t.auth_password(username,password,fallback=False)
            else: raise Exception(‘Must supply either key_file or password‘)
        self.sftp=paramiko.SFTPClient.from_transport(self.t)

    def command(self,cmd):
        #  Breaks the command by lines, sends and receives 
        #  each line and its output separately
        #
        #  Returns the server response text as a string

        chan = self.t.open_session()
        chan.get_pty()
        chan.invoke_shell()
        chan.settimeout(20.0)
        ret=‘‘
        try:
            ret+=chan.recv(1024)
        except:
            chan.send(‘\n‘)
            ret+=chan.recv(1024)
            ret+=chan.recv(1024)
            ret+=chan.recv(1024)
        for line in cmd.split(‘\n‘):
            chan.send(line.strip() + ‘\n‘)
            ret+=chan.recv(1024)
        return ret

    def put(self,localfile,remotefile):
        #  Copy localfile to remotefile, overwriting or creating as needed.
        self.sftp.put(localfile,remotefile)

    def put_all(self,localpath,remotepath):
        #  recursively upload a full directory
        os.chdir(os.path.split(localpath)[0])
        parent=os.path.split(localpath)[1]
        for walker in os.walk(parent):
            try:
                self.sftp.mkdir(os.path.join(remotepath,walker[0]))
            except:
                pass
            for file in walker[2]:
                self.put(os.path.join(walker[0],file),os.path.join(remotepath,walker[0],file))

    def get(self,remotefile,localfile):
        #  Copy remotefile to localfile, overwriting or creating as needed.
        self.sftp.get(remotefile,localfile)

    def sftp_walk(self,remotepath):
        # Kindof a stripped down  version of os.walk, implemented for 
        # sftp.  Tried running it flat without the yields, but it really
        # chokes on big directories.
        path=remotepath
        files=[]
        folders=[]
        for f in self.sftp.listdir_attr(remotepath):
            if S_ISDIR(f.st_mode):
                folders.append(f.filename)
            else:
                files.append(f.filename)
        print (path,folders,files)
        yield path,folders,files
        for folder in folders:
            new_path=os.path.join(remotepath,folder)
            for x in self.sftp_walk(new_path):
                yield x

    def get_all(self,remotepath,localpath):
        #  recursively download a full directory
        #  Harder than it sounded at first, since paramiko won‘t walk
        #
        # For the record, something like this would gennerally be faster:
        # ssh [email protected] ‘tar -cz /source/folder‘ | tar -xz

        self.sftp.chdir(os.path.split(remotepath)[0])
        parent=os.path.split(remotepath)[1]
        try:
            os.mkdir(localpath)
        except:
            pass
        for walker in self.sftp_walk(parent):
            try:
                os.mkdir(os.path.join(localpath,walker[0]))
            except:
                pass
            for file in walker[2]:
                self.get(os.path.join(walker[0],file),os.path.join(localpath,walker[0],file))
    def write_command(self,text,remotefile):
        #  Writes text to remotefile, and makes remotefile executable.
        #  This is perhaps a bit niche, but I was thinking I needed it.
        #  For the record, I was incorrect.
        self.sftp.open(remotefile,‘w‘).write(text)
        self.sftp.chmod(remotefile,755)
时间: 2024-12-18 11:59:36

paramiko多进程同步目录的相关文章

使用rsync同步目录

本文描述了linux下使用rsync单向同步两个机器目录的问题. 使用rsync同步后可以保持目录的一致性(含删除操作). 数据同步方式 从主机拉数据 备机上启动的流程 同步命令: rsync -avzP --delete [email protected]{remoteHost}:{remoteDir} {localDir} 参数说明: -a 参数,相当于-rlptgoD(-r 是递归 -l 是链接文件,意思是拷贝链接文件:-p 表示保持文件原有权限:-t 保持文件原有时间:-g 保持文件原有

C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转

原文:C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). 内存映射文件对于托管世界的开发人员来说似乎很陌生,但它确实已经是很远古的技术了,而且在操作系统中地位相当.实际上,任何想要共享数据的通信模型都会在幕后使用它. 内存映射文件究竟是个什么?内存映射文件允许你保留一块地址空间,然后将该物理存储映射到这块内存空间中进行操作.物理存储是文件管理,而内存

rsync同步目录

sudo rsync -ave ssh /home/daniel/sc [email protected]:/home/daniel/sc 如果提示无法mkdir,可能是权限的问题 ? 1 sudo chmod 777 /home/daniel/sc rsync同步目录,布布扣,bubuko.com

Rsync服务实时同步目录

-- sync 同步async 异步rsync 远程同步 rsync     remote sync    远程同步 拷贝和同步的区别? rsync  - faster, flexible replacement for rcp rsync  - a fast, versatile, remote (and local)       file-copying tool Wget - The non-interactive network down-loader. wget http://10.1

python类库32[多进程同步Lock+Semaphore+Event]

python类库32[多进程同步Lock+Semaphore+Event] 同步的方法基本与多线程相同. 1) Lock 当多个进程需要访问共享资源的时候,Lock可以用来避免访问的冲突. import multiprocessingimport sys def worker_with(lock, f):    with lock:        fs = open(f,"a+")        fs.write('Lock acquired via with\n')        f

两台linux服务器器同步目录脚本

在集群环境中,在打补丁,或安装新软件后,经常需要同步目录. 下面我做了一个脚本,用于完成这个过程. 因为没有在两台机器间做ssh互信,因此,执行过程中需要输入远程机器密码. #!/bin/bash #author:wjf #date:2015/06/01 #desc:同步一台机器上的一个文件夹至远程机器,可用于集群环境中的代码同步 #使用限制:1.同步文件夹路径中不允许出现空格 # 2.远程机器中同步文件夹的上层路径必须手动检查建立 v_tongbu_dir=/tmp/wjf/ #-------

rsync同步目录及同步文件

最简单的只读同步工作. 一,服务端的配置 1,安装rsync(阿里云默认已有此程序) 略 2,生成文件rsyncd.conf,内容如下: #secrets file = /etc/rsyncd.secrets #motd file = /etc/rsyncd.motd read>list = yes uid = xx gid = xxt use chroot = no max connections = 5 log file = /var/log/rsyncd.log pid file = /v

Linux使用rsync客户端与服务端同步目录进行备份

一.服务端设置 1. 修改 server 端配置 # vi /etc/rsyncd.conf 修改: uid = nobody                          # 该选项指定当该模块传输文件时守护进程应该具有的uid.默认值为”nobody”.gid = nobody                          # 该选项指定当该模块传输文件时守护进程应该具有的gid.默认值为”nobody”.max connections = 4                   

C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped

节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). 内存映射文件对于托管世界的开发人员来说似乎很陌生,但它确实已经是很远古的技术了,而且在操作系统中地位相当.实际上,任何想要共享数据的通信模型都会在幕后使用它. 内存映射文件究竟是个什么?内存映射文件允许你保留一块地址空间,然后将该物理存储映射到这块内存空间中进行操作.物理存储是文件管理,而内存映射文件是操作系统级内存管理. 优势:     1.访问磁盘文件上的数据不需执行I/O操作和缓存