python之ftp与paramiko与hasattr与getattr

Posted 晴晴小可爱的小弟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python之ftp与paramiko与hasattr与getattr相关的知识,希望对你有一定的参考价值。

为了方便树莓派和电脑上相互传输数据文件的传输。也就是上传和下载文件,我自己就写了一个ftp

主要是运用到hasattr与getattr

先看一下服务器上的程序吧

# _*_coding:utf-8_*_
# /usr/bin/env python3
# Author:book Miki

import socketserver
import json
import os

class MysocketHand(socketserver.BaseRequestHandler):
    def handle(self):
        while True:
            try:
                self.data = self.request.recv(1024)
                commond = json.loads(self.data)
                action = commond["action"]
                if hasattr(self, action):
                    fun = getattr(self, action)
                    fun(commond)
                print("{} wrote:".format(self.client_address[0]))
                print(self.data.decode())
            except ConnectionResetError as e:
                print(eer, e)
                break

    def put(self, *args):
        ‘‘‘ 接收客户端文件 ‘‘‘
        cmd_dir = args[0]
        filename = cmd_dir[filename]
        filesize = int(cmd_dir[filesize])
        if os.path.isfile(filename):
            f = open(filename + .new, wb)
        else:
            f = open(filename, wb)

        self.request.send(b200 ok)
        recv_size = 0
        recv_size = int(recv_size)
        while recv_size < filesize:
            recv_data = self.request.recv(1024)
            f.write(recv_data)
            recv_size += len(recv_data)
            print("已经加载 %s :" % (recv_size/filesize*100))
            print(recv_size, recv size, filesize, file size)

        else:
            print( %s is ok % filename)
            f.close()

    def get(self, *args):
        filename = args[0][filename]

        msg_dir = {
            yes_or_no: none,
            file_size: 0
        }
        if os.path.isfile(filename):
            file_size = os.stat(filename).st_size
            msg_dir[yes_or_no] = yes
            msg_dir[file_size] = file_size
            self.request.send(json.dumps(msg_dir).encode())
            queren = self.request.recv(1024).decode()
            if queren == y:
                f = open(filename, rb)
                for line in f:
                    self.request.send(line)
                f.close()
            else:
                print(error)

        else:
            msg_dir[yes_or_no] = no
            self.request.send(json.dumps(msg_dir).encode())


if __name__ == __main__:
    HOST, POST = localhost, 9999
    sever = socketserver.ThreadingTCPServer((HOST, POST), MysocketHand)
    sever.serve_forever()

接下来是客户端的

# _*_coding:utf-8_*_
# /usr/bin/env python3
# Author:book Miki

import socket
import os
import json


class Myclient(object):
    def __init__(self, ip, port):
        self.client = socket.socket()
        self.ip = ip
        self.port = port
    def help(self):
        msg = ‘‘‘
        ls
        cd
        pwd
        get filename
        put filename
        ‘‘‘
    def connent(self):
        self.client.connect((self.ip, self.port))

    def interactive(self):
        while True:
            msg = input(>>;)
            if len(msg) == 0:
                continue
            mst_cmd = msg.split()[0]
            if hasattr(self, "cmd_%s" % mst_cmd):
                fun = getattr(self, cmd_%s % mst_cmd)
                fun(msg)
            else:
                self.help()
    def cmd_put(self,*args):
        cmd_split = args[0].split()
        if len(cmd_split) > 1:
            filename = cmd_split[1]
            if os.path.isfile(filename):
                filesize = os.stat(filename).st_size
                msg_dic = {
                    "action": "put",
                    "filename": filename,
                    "filesize": filesize
                }
                self.client.send(json.dumps(msg_dic).encode())
                # 防止粘包
                self.client.recv(1024)
                f = open(filename, rb)
                for line in f:
                    self.client.send(line)
            else:
                print(filename, " is none")
    def cmd_get(self,*args):
        cmd_split = args[0].split()
        if(len(cmd_split)>1):
            filename = cmd_split[1]
            msg_dic = {
                "action": "get",
                "filename": filename
            }
            self.client.send(json.dumps(msg_dic).encode())
            action = json.loads(self.client.recv(1024))
            yes_or_no = action[yes_or_no]
            if yes_or_no == yes:
                queren = input(downland %s y/n % filename)
                self.client.send(queren.encode())
                if queren == y:
                    if os.path.isfile(filename):
                        f = open(filename+new,wb)
                    else:
                        f = open(filename,wb)
                    file_size = action[file_size]
                    recv_size = 0
                    while file_size > recv_size:
                        recv_data = self.client.recv(1024)
                        recv_size += len(recv_data)
                        f.write(recv_data)
                        print(已下载 : %s %% % (recv_size / file_size *100))
                    else:
                        print(下载成功)
                        f.close()
                else:
                    print(取消下载)
            else:
                print(json.loads(self.client.recv(1024)).decode())


a = Myclient(192.168.43.140, 9999)
a.help()
a.connent()
a.interactive()

如此一来我在树莓派上的数据就可以发送到本地了

可是我就在今天发现了prarmiko这个模块我真的是气死了因为他只需要三五行代码就解决了我两百多行代码的问题

请看

# 树莓派实证有效
import paramiko
transport =paramiko.Transport((192.168.43.140,22))
transport.connect(username=pi,password=raspberrypi)
sftp = paramiko.SFTPClient.from_transport(transport)
sftp.put(text1, /home/pi/python_code/python_ssh/socketsever.py)
# sftp.get(‘remove_path‘, ‘local_path‘)
transport.close()

是不是太简单了?但是也不亏哈哈哈,自己写了一个ftp的简易版也算是了解了其中的奥妙了

以上是关于python之ftp与paramiko与hasattr与getattr的主要内容,如果未能解决你的问题,请参考以下文章

paramiko 几种不方式SSH与FTP登录连接方式

python2 paramiko模块初试   连接 ssh_connect 上传 FTP_post

python小白之paramiko

python paramiko模拟ssh登录

python运维之使用python进行批量管理主机

python paramiko与linux的连接