Python实现阿里云aliyun服务器里的文件上传与下载

Python实现阿里云服务器里的文件上传与下载
Python实现阿里云服务器里的文件上传与下载
背景:
正文:
预备环境:
构想:
实现:
注意:
结尾
018.4.15

背景:
老实说,因为现实的各种原因造成电脑换来换去是可能出现的事情,但是电脑能换,电脑里的环境却不能换。我就曾在三个电脑里各自安装了虚拟机,这样一来,所有考虑到的情况下都可以好好编程了。本来该自鸣得意的时候,可别忙,环境的安装老是重复出现,scrapy框架安装三次,PIL安装三次,MongoDB三次……直到我想吐了。照理说,程序员最忌讳的就是重复造轮子,其“重复”二字应该是所有参与写代码人的天敌。但我之前居然乐此不彼……以后会越来多的模块需要安装,但我恐怕在这事儿上不会有越来越多的耐心。

当然,有问题不可怕,解决就好。了解到阿里云之后,因为是学生的身份,租借服务器优惠力度很大。因为暂时还不会需要太大的处理环境,所以选择了云服务器ECS,一年的使用期,想是够用的。配置环境,开心的敲代码……

但是世事总不随人意,问题又一次出现。这一次是:我爬虫到的数据没办法拿到本地来。所以继续:有问题不可怕,解决就好。继续正面刚。

网上搜到的方法很多,但都不如我意。至少win上的远程桌面连接于我来说,怎么都行不通。最后择选了利用sftp协议实现的文件

上传下载的功能。因为自己敲出的代码方便自己是一件很有成就感的事。具体实现参考过河卒子Rover的方法点击打开链接,在这里感谢他。

正文:
预备环境:
环境:win7 
所需模块:paramiko 
安装方式:pip3 install paramiko 
建议远程连接工具:Xshell5 (老实说,喜欢)

 

构想:
由于常在linux环境下写东西,所以希望写出来的东西在使用的时候也很linux。因此希望最后可以是这样的:python3 SFTP.py [ip] [filename] [-d|u|h]

实现:
构想好之后就可以动手实现了。参数很好解决,是python自带模块sys,sys.argv。sys.argv[0]是执行的文件名,sys.argv[1]……,后面依次。为了提高代码的健壮性,所以写了help()函数做提示

 

由于初次使用,可能会对所需要的参数还不了解,所以在设计之处决定,在单独使用文件时,会直接启动help()函数

 

整个代码中最为关键的部分: 
conn.connect(username = self.name, password = passwd) 
self.sftp_ob = paramiko.SFTPClient.from_transport(conn) 
self.sftp_ob.put() 
self.sftp_ob.get()

注意:
在put()和get()函数中,对于远程链接的linux的文件路径,一定要绝对的准确,如果文件在家目录中,不能用~,而是/home/... 不然会提示找不到路径。
指定win7下的路径时,需要linux化,比如在win上是D:\aliyun\download\,应该写成D:/aliyun/download/
结尾
由于写出的代码是自己再用,所以考虑的状况并不算多,健壮性依然堪忧。不过根据自己的实际需求对代码修改。 
最后贴出完整的代码。因能力有限,纰漏处望各友指正。

#!/usr/bin/env python
# coding=utf-8

import paramiko
import sys

class SFTP():
    """
    实现ssh远程登陆,并且上传下载文件
    """

    def __init__(self, ip=None, filename=None, choose="-h"):
        self.ip = ip
        # 如果常用一个ip,可以设置默认ip
        if not self.ip:
            self.ip = "阿里云服务器ip"
        self.filename = filename
        self.choose = choose

        self.justice()

    def justice(self):
        # 判断用户需要的功能
        """
        根据参数,判断执行函数
        """
        if self.choose == "-d":
            self.do_it = self.download
        elif self.choose == "-u":
            self.do_it = self.upload
        elif self.choose == "-h":
            self.do_it = self.help
        else:
            self.do_it = self.help

    def start(self):
        # 执行
        self.do_it()

    def help(self):
        # 帮助文档
        print("\n", end="")
        print("参数:")
        print("-d[download]  下载文件")
        print("-u[upload]    上传文件")
        print("-h[help]      帮    助")
        print("\n", end="")
        print("格式:")
        print("python3 STFP.py [ip] [filename] [-u|-d|-h]")

    def connect(self):
        # 连接
        try:
            conn = paramiko.Transport((self.ip, 22))
        except Exception as e:
            print(e)
        else:
            # 用户名,用户密码
            self.name = input("用户名:")
            passwd = input("登陆密码:")
            try:
                # 尝试与远程服务器连接
                conn.connect(username = self.name, password = passwd)
                self.sftp_ob = paramiko.SFTPClient.from_transport(conn)
            except Exception as e:
                # 失败则打印原因
                print(e)
                return
            else:
                print("连接成功!")

    def download(self):
        self.connect()
        # print("正在下载..")
        self.sftp_ob.get("/home/"+self.name.lower()+"/download/"+self.filename, "D:/aliyun/download/"+self.filename)
        print("完成!")

    def upload(self):
        self.connect()
        # print("正在上传...")
        self.sftp_ob.put("D:/aliyun/upload/"+self.filename, "/home/"+self.name.lower()+"/upload/"+self.filename)
        print("完成!")


def main():
    try:
        sftp = SFTP(sys.argv[1], sys.argv[2], sys.argv[3])
    except:
        if "-h" in sys.argv:
            sftp = SFTP(choose=sys.argv[1])
        else:
            sftp = SFTP()

    sftp.start()

if __name__ == "__main__":
    main()
--------------------- 
作者:有关心情 
来源:CSDN 
原文:https://blog.csdn.net/qq_41359051/article/details/79965814 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值