Python 基于Python实现的ssh兼sftp客户端(上)

简介: Python 基于Python实现的ssh兼sftp客户端(上)

基于Python实现sshsftp客户端

 

 

实现功能

实现ssh客户端兼ftp客户端:实现远程连接,执行linux命令,上传下载文件

 

测试环境

Win7 64

 

Python 3.3.4

 

paramiko 1.15.2

下载地址:

https://pypi.python.org/pypi/paramiko/1.15.2

https://pan.baidu.com/s/1i4SJ1CL

 

cryptography-1.0-cp34-none-win_amd64.whl

(如果paramiko可以正常安装完,则不需要安装该类库)

下载地址:

https://pypi.python.org/pypi/cryptography/1.0

https://pan.baidu.com/s/1jIRBJvg

 

安装好后,找到nt.py(本例中路径为:

Lib\site-packages\pycrypto-2.6.1-py3.4-win-amd64.egg\Crypto\Random\OSRNG\nt.py),修改

import winrandom

from Crypto.Random.OSRNG import winrandom

如下

#import winrandom

from Crypto.Random.OSRNG import winrandom

 

以解决ImportError: No module named 'winrandom'错误

 

 

VS2010

因操作系统而异,可能需要安装VS2010,以解决包依赖问题

 




代码实践

mysshclient.py

 

#!/usr/bin/env/ python
# -*- coding:utf-8 -*-

__author__ ='shouke'

importos
fromparamiko.clientimportAutoAddPolicy
fromparamiko.clientimportSSHClient
fromotherToolsimportOtherTools

classMySSHClient:
   def__init__(self):
       self.ssh_client = SSHClient()

   # 连接登录
   defconnect(self, hostname, port, username, password):
       try:
           print('正在远程连接主机:%s'% hostname)
           self.ssh_client.set_missing_host_key_policy(AutoAddPolicy())
           self.ssh_client.connect(hostname=hostname,port=port,username=username,password=password)
           return[True,'']
       exceptExceptionase:
           print('连接出错了%s'% e)
           return[False,'%s'% e]

   # 远程执行命令
   defexec_command(self, command):
       try:
           print('正在执行命令:'+ command)
           stdin, stdout, stderr =self.ssh_client.exec_command(command)
           print('命令输出:')
           print(stdout.read())# 读取命令输出
           return[True,tuple]
       exceptExceptionase:
           print('执行命:%s令出错'% command)
           return[False,'%s'% e]

   # 下载文件(非目录文件)
   defdownload_file(self, remotepath, localpath):
       try:
           localpath = os.path.abspath(localpath)
           localpath = localpath.replace('\t','/t').replace('\n','/n').replace('\r','/r').replace('\b','/b')# 转换特殊字符
           localpath = localpath.replace('\f','/f')
           print('转换后的本地目标路径为:%s'% localpath)
           head, tail = os.path.split(localpath)
           if nottail:
               print('下载文件:%s到本地:%s失败,本地文件名不能为空'% (remotepath, localpath))
               return[False,'下载文件:%s到本地:%s失败,本地文件名不能为空'% (remotepath, localpath)]
           if notos.path.exists(head):
               print('本地路径:%s不存在,正在创建目录'% head)
               OtherTools().mkdirs_once_many(head)

           sftp_client =self.ssh_client.open_sftp()
           print('正在下载远程文件:%s到本地:%s'% (remotepath, localpath))
           sftp_client.get(remotepath, localpath)
           sftp_client.close()
           return[True,'']
       exceptExceptionase:
           print('下载文件:%s到本地:%s出错:%s'% (remotepath, localpath, e))
           return[False,'下载文件:%s到本地:%s出错:%s'% (remotepath, localpath, e)]

   # 上传文件(非目录文件)
   defupload_file(self, localpath, remotepath):
       try:
           localpath = localpath.rstrip('\\').rstrip('/')
           localpath = localpath.replace('\t','/t').replace('\n','/n').replace('\r','/r').replace('\b','/b')# 转换特殊字符
           localpath = localpath.replace('\f','/f')
           localpath = os.path.abspath(localpath)
           print('转换后的本地文件路径为:%s'% localpath)

           remotepath = remotepath.rstrip('\\').rstrip('/')
           head, tail = os.path.split(localpath)
           if nottail:
               print('上传文件:%s到远程:%s失败,本地文件名不能为空'% (localpath, remotepath))
               return[False,'上传文件:%s到远程:%s失败,本地文件名不能为空'% (localpath, remotepath)]
           if notos.path.exists(head):
               print('上传文件:%s到远程:%s失败,父路径不存在'% (localpath, remotepath, head))
               return[False,'上传文件:%s到远程:%s失败,父路径不存在'% (localpath, remotepath, head)]

           if not(remotepath.startswith('/')orremotepath.startswith('.')):
               print('上传文件:%s到远程:%s失败,远程路径填写不规范%s'% (localpath, remotepath,remotepath))
               return[False,'上传文件:%s到远程:%s失败,远程路径填写不规范%s'% (localpath, remotepath,remotepath)]
           sftp_client =self.ssh_client.open_sftp()
           head, tail = os.path.split(remotepath)

           head = sftp_client.normalize(head)# 规范化路径
           remotepath = head +'/'+ tail
           print('规范化后的远程目标路径:', remotepath)

           print('正在上传文件:%s到远程:%s'% (localpath, remotepath))
           sftp_client.put(localpath, remotepath)
           sftp_client.close()
           return[True,'']
       exceptExceptionase:
           print('上传文件:%s到远程:%s出错:%s'% (localpath, remotepath, e))
           return[False,'上传文件:%s到远程:%s出错:%s'% (localpath, remotepath, e)]

   defclose(self):
       self.ssh_client.close()


 

 

目录
相关文章
|
28天前
|
Ubuntu 网络安全 数据安全/隐私保护
如何在 Ubuntu 上创建一个 SSH CA 以验证主机和客户端
如何在 Ubuntu 上创建一个 SSH CA 以验证主机和客户端
41 0
|
3月前
|
XML 物联网 API
服务端和客户端 RESTful 接口上传 Excel 的 Python 代码
本文作者木头左是物联网工程师,分享如何使用 Python 和 Flask-RESTful 构建一个简单的 RESTful API,实现文件上传功能,特别支持Excel文件。通过安装Flask和Flask-RESTful库,创建Flask应用,实现文件上传接口,并将其添加到API。该方法具有简单易用、灵活、可扩展及社区支持等优点。
服务端和客户端 RESTful 接口上传 Excel 的 Python 代码
|
25天前
|
网络协议 安全 Unix
6! 用Python脚本演示TCP 服务器与客户端通信过程!
6! 用Python脚本演示TCP 服务器与客户端通信过程!
|
28天前
|
传感器 数据采集 算法
python实现ModBusRTU客户端方式
python实现基于串口通信的ModBusRTU客户端是一件简单的事情,只要通过pymodbus模块就可以实现。
|
1月前
|
开发者 Python
深入解析Python `httpx`源码,探索现代HTTP客户端的秘密!
深入解析Python `httpx`源码,探索现代HTTP客户端的秘密!
62 1
|
1月前
|
运维 安全 网络安全
"革新远程访问体验:Docker化部署webssh2,一键启动Web SSH客户端,让远程管理如虎添翼!"
【8月更文挑战第2天】Docker作为软件开发与运维的关键工具,以其轻量级、可移植及强隔离特性简化了应用部署。结合webssh2这一开源Web SSH客户端,可通过浏览器安全便捷地访问SSH服务器,无需额外软件。首先确保已安装Docker,接着拉取webssh2镜像并运行容器,映射端口以便外部访问。配置好SSH服务器后,通过浏览器访问指定URL即可开始SSH会话。此方案不仅提升了用户体验,还加强了访问控制与系统安全。
91 7
|
2月前
|
传感器 数据采集 算法
python实现ModBusRTU客户端方式
python实现基于串口通信的ModBusRTU客户端是一件简单的事情,只要通过pymodbus模块就可以实现。
|
3月前
|
JSON 数据格式 Python
Python 的 requests 库是一个强大的 HTTP 客户端库,用于发送各种类型的 HTTP 请求
【6月更文挑战第15天】Python的requests库简化了HTTP请求。安装后,使用`requests.get()`发送GET请求,检查`status_code`为200表示成功。类似地,`requests.post()`用于POST请求,需提供JSON数据和`Content-Type`头。
48 6
|
3月前
|
Linux 数据安全/隐私保护 Python
使用Python实现Linux惠尔顿上网认证客户端
使用Python实现Linux惠尔顿上网认证客户端
|
4月前
|
JSON 数据格式 Python
Python 的 requests 库是一个强大的 HTTP 客户端库,用于发送各种类型的 HTTP 请求
【5月更文挑战第9天】`requests` 库是 Python 中用于HTTP请求的强大工具。要开始使用,需通过 `pip install requests` 进行安装。发送GET请求可使用 `requests.get(url)`,而POST请求则需结合 `json.dumps(data)` 以JSON格式发送数据。PUT和DELETE请求类似,分别调用 `requests.put()` 和 `requests.delete()`。
56 2