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(b'200 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的更多相关文章
- python实现FTP程序
python实现FTP程序 程序源码 上传功能 查看文件 cd功能 创建目录 程序源码 目录结构 服务端 主程序 import optparse import socketserver import ...
- Python实现FTP服务功能
本文从以下三个方面, 阐述Python如何搭建FTP服务器 一. Python搭建FTP服务器 二. FTP函数释义 三. 查看目录结构 四. 上传下载程序 一. Python搭建FTP服务器 1. ...
- Python之FTP实现
Python之FTP实现 上传下载: import socket import struct import json import subprocess import os class MYTCPSe ...
- 【转】Linux环境搭建FTP服务器与Python实现FTP客户端的交互介绍
Linux环境搭建FTP服务器与Python实现FTP客户端的交互介绍 FTP 是File Transfer Protocol(文件传输协议)的英文简称,它基于传输层协议TCP建立,用于Interne ...
- Python之FTP多线程下载文件之分块多线程文件合并
Python之FTP多线程下载文件之分块多线程文件合并 欢迎大家阅读Python之FTP多线程下载系列之二:Python之FTP多线程下载文件之分块多线程文件合并,本系列的第一篇:Python之FTP ...
- Python之FTP多线程下载文件之多线程分块下载文件
Python之FTP多线程下载文件之多线程分块下载文件 Python中的ftplib模块用于对FTP的相关操作,常见的如下载,上传等.使用python从FTP下载较大的文件时,往往比较耗时,如何提高从 ...
- [源码]python Scapy Ftp密码嗅探
[源码]python Scapy Ftp密码嗅探 原理很简单,FTP密码明文传输的 截取tcp 21端口User和Pass数据即可 Scapy框架编译程序较大(一个空程序都25M),所以就不提供exe ...
- python实现FTP弱口令扫描器与简单端口扫描器
python实现FTP弱口令扫描器与简单端口扫描器 目录 FTP弱口令扫描器 简单端口扫描器 参考: https://blog.csdn.net/rebelqsp/article/details/22 ...
- Python 基于Python实现Ftp文件上传,下载
基于Python实现Ftp文件上传,下载 by:授客 QQ:1033553122 测试环境: Ftp客户端:Windows平台 Ftp服务器:Linux平台 Python版本:Python 2.7 ...
随机推荐
- pycharm2018.1下载激活(mac平台)
此教程实时更新,请放心使用:如果有新版本出现猪哥都会第一时间尝试激活: pycharm官网下载地址:http://www.jetbrains.com/pycharm/download/ 激活前准备工作 ...
- C# / VB.NET 在PPT中创建、编辑PPT SmartArt图形
本文介绍通过C#和VB.NET程序代码来创建和编辑PPT文档中的SmartArt图形.文中将分两个操作示例来演示创建和编辑结果. 使用工具:Spire.Presentation for .NET ho ...
- Markdown基础知识
一 Markdown简介 Markdown是⼀种可以使⽤普通⽂本编辑器编写的标记语⾔,通过简单的标记语法,它可以使普通⽂本内容具有⼀定的格式,可以简单理解为纯⽂本格式的word. 软件⼀般⽤vscod ...
- Java中try()...catch()用法
在stackoverflow偶尔看到的一个关于try()...catch()的用法,通常我们使用try...catch()捕获异常的,如果遇到类似IO流的处理,要在finally部分关闭IO流,当然这 ...
- 学会Git玩转GitHub(第二篇) 入门详解 - 精简归纳
学会Git玩转GitHub(第二篇) 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 10 / 25 转载请注明出处!️ 目录 学会Git玩转GitHub(第二篇) 入门详解 - 精简归纳 ...
- 渗透测试全流程靶机vulnhubDC-1完成笔记
镜像下载地址 https://www.vulnhub.com/entry/dc-1-1,292/ 信息收集 1.可以使用netdiscover -i eth0 发现二层网络信息 发现两个设备(103是 ...
- js 重排和重绘
1.什么是重排和重绘 浏览器下载完页面中的所有组件--HTML标记.JavaScript.CSS.图片之后会解析生成两个内部数据结构--DOM树和渲染树. DOM树表示页面结构,渲染树表示DOM节点如 ...
- C1. Pokémon Army (easy version) 解析(DP)
Codeforce 1420 C1. Pokémon Army (easy version) 解析(DP) 今天我們來看看CF1420C1 題目連結 題目 對於一個數列\(a\),選若干個數字,求al ...
- c语言之指针特性
0x01.指针的声明 char x; char* x; short y; short* y; int z; int* z; float f; float* f; double d; double* d ...
- 把 Console 部署成 Windows 服务,四种方式总有一款适合你!
一:背景 1. 讲故事 上周有一个项目交付,因为是医院级项目需要在客户的局域网独立部署. 程序: netcore 2.0,操作系统: windows server 2012,坑爹的事情就来了, net ...