鱼C论坛

 找回密码
 立即注册
查看: 1342|回复: 22

关于Paramiko 的实际应用求助

[复制链接]
发表于 2018-9-18 17:16:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本人为python的萌新一枚。刚学习不到半个月,所以很多简单的概念都不清楚。。现在有这样一个实际问题需要请教论坛的各位大大。

需求是这样的:
    本地服务器需每天定时从远程服务器下载文件,文件数量为2,但文件路径和文件名每天都会变更。每天定时执行python程序这个简单,本地是微软的Windows系统,可以用计划任务定时执行就OK。但python脚步这块如何编译,小弟就无限头痛了。。。
    具体描述下已知情况:
    本地服务器windows系统 存放路径D:\TEST  
    远程服务器系统未知,远程协议 sftp  登陆IP:A.A.A.A;用户名:aaa;密码:bbb;端口:ccc;远程绝对路径未知,每天需要下载的相对路径根据日期变更,比如今天是2018年9月18日,远程服务器需要下载的文件相对路径就是 2018/09/15/(每次下载3天前的)下面的两个文件20180915a和20180915b
    (这两个文件名有规律,可做成excel或者txt进行调用)。以此类推,2018年9月19日,远程服务器需要下载的文件相对路径就是 2018/09/16/下面的两个文件20180916a和20180916b



本人的python版本是3.4  求大佬指教如何完成这个编译。。。(如果能有详细点的注释就更好了,膜拜~~~)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-9-18 17:25:53 | 显示全部楼层
有木有大神帮助解决下啦~!~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-19 08:24:34 | 显示全部楼层
有木有大神帮助解决下啦~!~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-19 09:45:49 | 显示全部楼层
文件路径确定是当前日期的前三天吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-19 10:36:50 | 显示全部楼层
一般来说是当前日期的前一天,但对端不稳定,可能1-3天,开始的时候我想着按找三天的来,顺便学习下大神思路。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-19 10:42:48 | 显示全部楼层
server端是linux吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-19 12:18:46 | 显示全部楼层
说句实在的windows端真心不了解。。。linux的话有N个方法解决。如果想简单解决,直接用rsync软件同步即可。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-19 14:26:00 | 显示全部楼层
server端应该是linux系统,因为文件夹属性是drwxrwx---,文件属性是-rwxrwx---
具体情况需要跟对方沟通确认,还挺麻烦。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-19 15:46:48 | 显示全部楼层
# -*- coding: utf-8 -*-

import os
import paramiko
import datetime

username = ""  # server端账户
password = ""  # server端密码
hostname = ""  # server端ip
port = 22      # server端端口

today = datetime.date.today()  # result:2018-9-19 获取今天日期

n = 1

try:
    transport = paramiko.Transport((hostname, port))
    transport.connect(username=username, password=password)
    ssh = paramiko.SSHClient()  # 创建ssh对象
    ssh._transport = transport
except Exception as e:
    print(e)
else:
    '''server端路径不明确  可能1-3天'''
    while n < 4:
        '''result : /2018/9/X  定义server端文件目录路径'''
        work_path = os.path.join(r'/', str(today.year), str(today.month), str(today.day - n)).replace('\\', '/')
        stdin, stdout, stderr = ssh.exec_command('ls {}'.format(work_path))  # server端执行命令  ls /2018/9/X
        result = stdout.read().decode()        # 获取server端命令执行结果
        if result == "":     #  如果执行结果为空  则表示命令执行错误 路径错误
            n += 1
            continue
        else:
            f = {}
            for file in result.split():
                file_path = os.path.join(work_path, file).replace('\\','/')
                f[file] = file_path
            print(f)
            sftp = paramiko.SFTPClient.from_transport(transport)  # 实例化sftp
            for key,values in f.items():
                local_path = os.path.join(r'd:\Test',key)
                sftp.get(values,local_path)               # 进行文件下载
                if os.path.exists(local_path):           # 判断该文件是否下载成功
                    print('{}:success'.format(key))
                else:
                    raise FileNotFoundError('文件下载未完成')
            break
    transport.close()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-19 17:33:23 | 显示全部楼层
满足你的需求吗  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-20 14:19:16 | 显示全部楼层
thank you very much!~我去试试~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-20 14:35:48 | 显示全部楼层
=。=   报错了,我把结果发下麻烦您看下,时间就按照昨天(当天-1)算吧。
另外就是关于我远程服务器端的表述有些问题,是这样:
我用sftp软件登陆看过,对端服务器文件路径是这样/CCPP/2018/05/10/AL-20180510
其中/CCPP/是固定的,然后2018是根据年份变动,05是根据月份变动,10是根据日变动,最后的AL-20180510是文件名,根据日期变动后面,前缀AL-不变
下载到本地不区分文件夹,统一放到D:\TEST里就OK
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-20 14:36:29 | 显示全部楼层
{'allows': '/2018/9/19/allows', 'sftp': '/2018/9/19/sftp', 'service': '/2018/9/19/service', 'This': '/2018/9/19/This', 'connections': '/2018/9/19/connections', 'only.': '/2018/9/19/only.'}
Traceback (most recent call last):
  File "d:\Test", line 42, in <module>
    sftp.get(values,local_path)               # 进行文件下载
  File "C:\Users\Administrator\AppData\Roaming\Python\Python34\site-packages\paramiko\sftp_client.py", line 770, in get
    size = self.getfo(remotepath, fl, callback)
  File "C:\Users\Administrator\AppData\Roaming\Python\Python34\site-packages\paramiko\sftp_client.py", line 746, in getfo
    file_size = self.stat(remotepath).st_size
  File "C:\Users\Administrator\AppData\Roaming\Python\Python34\site-packages\paramiko\sftp_client.py", line 460, in stat
    t, msg = self._request(CMD_STAT, path)
  File "C:\Users\Administrator\AppData\Roaming\Python\Python34\site-packages\paramiko\sftp_client.py", line 780, in _request
    return self._read_response(num)
  File "C:\Users\Administrator\AppData\Roaming\Python\Python34\site-packages\paramiko\sftp_client.py", line 832, in _read_response
    self._convert_status(msg)
  File "C:\Users\Administrator\AppData\Roaming\Python\Python34\site-packages\paramiko\sftp_client.py", line 861, in _convert_status
    raise IOError(errno.ENOENT, text)
FileNotFoundError: [Errno 2] No such file
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-20 14:55:09 | 显示全部楼层
work_path = os.path.join(r'/CCPP/', str(today.year), str(today.month), str(today.day - n)).replace('\\', '/')  把work_path 改下    把d:\Test 改成D:\Test
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-20 15:20:14 | 显示全部楼层
还是报错,跟您了解下,账户密码IP端口这四个没问题,我看懂了,本地路径,远程路径变量看懂部分,应该不大会有问题。
但现在没看到下载的文件名设置部分,比如/CCPP/2018/05/10/AL-20180510,其中AL-20180510这个是文件名,前边的路径有了,文件名在哪定义的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-20 15:20:52 | 显示全部楼层
{'sftp': '/CCPP/2018/9/19/sftp', 'service': '/CCPP/2018/9/19/service', 'connections': '/CCPP/2018/9/19/connections', 'This': '/CCPP/2018/9/19/This', 'allows': '/CCPP/2018/9/19/allows', 'only.': '/CCPP/2018/9/19/only.'}
Traceback (most recent call last):
  File "C:/Users/Administrator/Desktop/工作内容2018/20180913/#downftp.py", line 42, in <module>
    sftp.get(values,local_path)               # 进行文件下载
  File "C:\Users\Administrator\AppData\Roaming\Python\Python34\site-packages\paramiko\sftp_client.py", line 770, in get
    size = self.getfo(remotepath, fl, callback)
  File "C:\Users\Administrator\AppData\Roaming\Python\Python34\site-packages\paramiko\sftp_client.py", line 746, in getfo
    file_size = self.stat(remotepath).st_size
  File "C:\Users\Administrator\AppData\Roaming\Python\Python34\site-packages\paramiko\sftp_client.py", line 460, in stat
    t, msg = self._request(CMD_STAT, path)
  File "C:\Users\Administrator\AppData\Roaming\Python\Python34\site-packages\paramiko\sftp_client.py", line 780, in _request
    return self._read_response(num)
  File "C:\Users\Administrator\AppData\Roaming\Python\Python34\site-packages\paramiko\sftp_client.py", line 832, in _read_response
    self._convert_status(msg)
  File "C:\Users\Administrator\AppData\Roaming\Python\Python34\site-packages\paramiko\sftp_client.py", line 861, in _convert_status
    raise IOError(errno.ENOENT, text)
FileNotFoundError: [Errno 2] No such file
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-20 15:28:41 | 显示全部楼层

{'sftp': '/CCPP/2018/9/19/sftp', 'service': '/CCPP/2018/9/19/service', 'connections': '/CCPP/2018/9/19/connections', 'This': '/CCPP/2018/9/19/This', 'allows': '/CCPP/2018/9/19/allows', 'only.': '/CCPP/2018/9/19/only.'}    这个字典返回的就是/CCPP/2018/9/19/下的所有文件  sftp是文件夹吗还是文件
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-20 15:53:55 | 显示全部楼层
用SFTP下载文件,不是文件夹。那问题在哪里呢。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-20 16:28:56 | 显示全部楼层
paramiko 的get方法 只能下载的是带后缀的文件  不是 目录  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-20 16:36:53 | 显示全部楼层
为什么我的可以成功
QQ图片20180920163528.png
QQ图片20180920163503.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-17 07:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表