利用python实现ftp和远程操作linux

    Hello,大家好,我是隔壁小王,最近在工作中初次接触了使用python进行远程的操作的模块,觉得蛮实用的,这里也跟大家分享下,当然大神就绕道吧偷笑

    这个库叫paramiko,这个库就是实现了一些远程协议的库,简单好用,功能能强大哦。

    先介绍一下sftp的实现流程,假设我们的要下载一个目录下的所有文件,大体的实现流程是:链接目标主机;创建sftp对象;得到远程目录里的所有目标文件名;利用文件名与本地保存的文件夹组成目标文件路径;下载;关闭链接。

    具体的代码如下:

def loadFile():
    tar_list = []
    local_list = []

    # connect server & get file
    transport = paramiko.Transport(('%s' % DataHost, DataPort))
    transport.connect(username=DataUser, password=DatapPassword)
    sftp = paramiko.SFTPClient.from_transport(transport)
    file_names = sftp.listdir(server_compress_file_path)
    for file in file_names:
        tar_list.append(server_file_path + file)
        local_list.append(local_file_path + file)

    for i in range(len(tar_list)):
        sftp.get(tar_list[i], local_list[i])
        
    transport.close()

    这是一个样例的函数,如果你想尝试,其中源目录、目的目录的路径(server_file_path, local_file_path)都是要自己另外设置内容的的。

    当然这就完善了吗?下载文件之前最好检查一下目标文件是否已经上传完成,那该怎么校验呢?用mtime,也就是文件的最后修改时间,姑且认为文件的最后修改时间如果超过当前时间2分钟这个文件就是上传完整的。怎么实现呢:

def checkTime(filePath):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(DataHost, DataPort, DataUser, DatapPassword)

    stdin, stdout, stderr = ssh.exec_command('stat ' + filePath)
    time_info = stdout.read()
    ssh.close()

    mtime = re.search('(最近改动:)(.{19})', time_info).group()[-19:]
    mtimestamp = time.mktime(time.strptime(mtime, "%Y-%m-%d %H:%M:%S"))
    curtime = time.time()

    if (curtime - mtimestamp) > 120:
        return True
    else:
        return False

    这里正好也提出的ssh的使用方法,大家可以看到,ssh的调用要更加简单,其中set_missing_host_key_policy()是用来绕过首次登陆时的验证的。使用exec_command可以得到一个反馈元组,这个元组中的参数2可以打印出远程文件的一些列信息,参数1是输入信息,参数3是反馈的错误信息。通过正则表达式找到最后修改时间,利用time模块转成时间戳与本地的时间戳进行比较,得到结果。这里提一嘴,我的正则很少用,写的比较生硬,所以匹配的时候没有排除“最近改动:”这几个字符,从而不得不选择切片最后的19个有用的时间字符,会正则可以帮我指导下,谢谢。

    那么这两段函数结合下:

def loadFile():
    tar_list = []
    local_list = []

    # connect server & get file
    transport = paramiko.Transport(('%s' % DataHost, DataPort))
    transport.connect(username=DataUser, password=DatapPassword)
    sftp = paramiko.SFTPClient.from_transport(transport)
    file_names = sftp.listdir(server_compress_file_path)
    for file in file_names:
        tar_list.append(server_file_path + file)
        local_list.append(local_file_path + file)

    for i in range(len(tar_list)):
        if checkTime(tar_list[i]):
            sftp.get(tar_list[i], local_list[i])
        else:
            printInfo("file:%s is not upload perfectly!" % tar_list[i])
            continue

    transport.close()

    这就是一个带sftp、ssh以及时间校验的远程文件下载样例了。

    谢谢您的阅读,如果有什么建议或指导欢迎您的留言。

猜你喜欢

转载自blog.csdn.net/BmwGaara/article/details/79483749
今日推荐