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()


 

 

目录
相关文章
|
3月前
|
Ubuntu 网络安全 数据安全/隐私保护
如何在 Ubuntu 上创建一个 SSH CA 以验证主机和客户端
如何在 Ubuntu 上创建一个 SSH CA 以验证主机和客户端
79 0
|
1月前
|
Python
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
使用Python的socket库实现客户端到服务器端的图片传输,包括客户端和服务器端的代码实现,以及传输结果的展示。
132 3
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
|
1月前
|
JSON 数据格式 Python
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
本文介绍了如何使用Python的socket模块实现客户端到服务器端的文件传输,包括客户端发送文件信息和内容,服务器端接收并保存文件的完整过程。
138 1
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
|
22天前
|
程序员 网络安全 开发工具
读书|通过 SSH & SFTP 管理 Kindle 上的文件
这是这个系列的第三篇文章,介绍我如何通过 SSH & SFTP 管理 Kindle 上的文件。
38 3
|
2月前
|
关系型数据库 MySQL Python
mysql之python客户端封装类
mysql之python客户端封装类
|
3月前
|
网络协议 安全 Unix
6! 用Python脚本演示TCP 服务器与客户端通信过程!
6! 用Python脚本演示TCP 服务器与客户端通信过程!
|
3月前
|
传感器 数据采集 算法
python实现ModBusRTU客户端方式
python实现基于串口通信的ModBusRTU客户端是一件简单的事情,只要通过pymodbus模块就可以实现。
|
3月前
|
开发者 Python
深入解析Python `httpx`源码,探索现代HTTP客户端的秘密!
深入解析Python `httpx`源码,探索现代HTTP客户端的秘密!
87 1
|
3月前
|
运维 安全 网络安全
"革新远程访问体验:Docker化部署webssh2,一键启动Web SSH客户端,让远程管理如虎添翼!"
【8月更文挑战第2天】Docker作为软件开发与运维的关键工具,以其轻量级、可移植及强隔离特性简化了应用部署。结合webssh2这一开源Web SSH客户端,可通过浏览器安全便捷地访问SSH服务器,无需额外软件。首先确保已安装Docker,接着拉取webssh2镜像并运行容器,映射端口以便外部访问。配置好SSH服务器后,通过浏览器访问指定URL即可开始SSH会话。此方案不仅提升了用户体验,还加强了访问控制与系统安全。
319 7
|
4月前
|
传感器 数据采集 算法
python实现ModBusRTU客户端方式
python实现基于串口通信的ModBusRTU客户端是一件简单的事情,只要通过pymodbus模块就可以实现。