Python paramiko实现文件的简单传输上传和下载代码

本文Python Code基于chatGPT的推荐,并修改调试实际运行通过,供学习参考。

paramiko介绍

Paramiko官方网站:Welcome to Paramiko! — Paramiko documentation

Paramiko GitHub页面:GitHub - paramiko/paramiko: The leading native Python SSHv2 protocol library.

Paramiko是一个用Python语言编写的实现SSH协议的库,可以轻松实现SSH和SFTP连接,从而进行SSH协议操作和SFTP文件传输。其中,SSH协议是基于TCP协议进行加密传输的远程登录协议,SFTP协议则是基于SSH协议进行加密传输的文件传输协议。

Paramiko不需要使用外部库或依赖,可以直接在Python程序中使用,并且提供了简洁的API,方便快捷地创建SSH和SFTP连接、在远程服务器中执行命令和文件上传下载等。此外,Paramiko还支持多并发连接、客户端日志记录、键验证等高级功能。

Paramiko广泛用于各种目的,包括自动化系统管理员任务、远程基础架构管理以及网络协议脚本测试等。它也是Python开发者在需要与使用SSH或SFTP协议的其他服务进行集成时的选择。

Paramiko 的主要特点包括:

  • 支持SSHv2、SFTP和SCP协议。
  • 高级加密算法实现安全通信。
  • 用于处理SSH和SFTP连接的简单直观API。
  • 支持于密钥和密码的身份验证。
  • 多线程和异步支持。
  • 内置支持SSH agent forwarding和X11 forwarding。

总的来说,如果你需要使用Python来自动化远程系统管理任务或管理远程基础架构,Paramiko是一个很好的选择。它可以轻松地创建安全的SSH和SFTP连接,并提供灵活的高级API,非常适合于许多不同的用例。

paramiko常用API

首先确保已经安装了paramiko,全新安装

$ pip install paramiko

Paramiko库提供了一组灵活的API,可以轻松实现SSH和SFTP连接和交互。下面是一些常用的API:

SSH连接和身份验证:

这个API可以创建一个SSH连接并进行身份验证。在这个例子中,我们使用set_missing_host_key_policy()方法来自动添加连接的主机密钥,使用connect()方法来连接到想要连接的主机。

import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('hostname', username='username', password='password')
SFTP连接和文件传输:

这个API可以创建一个SFTP连接并传输文件。在这个例子中,我们使用Transport()方法在指定的端口上创建传输对象,并使用connect()方法来连接到想要连接的主机。然后使用SFTPClient.from_transport()方法创建SFTP客户端,使用put()方法传送文件,最后关闭连接。

import paramiko

transport = paramiko.Transport(('hostname', 22))
transport.connect(username='username', password='password')
sftp = paramiko.SFTPClient.from_transport(transport)
sftp.put('/local/filename', '/remote/filename')
sftp.close()
transport.close()
远程命令执行:

这个API可以在远程计算机上执行命令并获取输出。在这个例子中,我们使用SSHClient()方法创建SSH连接并进行身份验证。然后,使用exec_command()方法通过SSH连接在远程计算机上执行命令,并使用read()方法获取输出。最后,关闭连接。

import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='hostname', username='username', password='password')
stdin, stdout, stderr = ssh.exec_command('ls -l')
print(stdout.read().decode())
ssh.close()

总的来说,Paramiko API是简单但非常灵活的,可以方便地实现SSH和SFTP连接和远程操作,在处理系统管理、远程基础架构管理和网络协议脚本测试等方面提供很好的帮助。 

python代码

import paramiko

def download_file(hostname, username, password, remote_path, local_path):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(hostname=hostname, username=username, password=password)
    sftp = ssh.open_sftp()
    sftp.get(remote_path, local_path)
    sftp.close()
    ssh.close()

def upload_file(hostname, username, password, remote_path, local_path):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(hostname=hostname, username=username, password=password)
    sftp = ssh.open_sftp()
    sftp.put(local_path, remote_path)
    sftp.close()
    ssh.close()

if __name__ == "__main__":
    hostname = "server_IP"
    username = "server_username"
    password = "server_password"
    remote_path = "~/download.file"
    local_path = "./download.file"
    remote_path_upload = "~/upload.file"
    local_path_upload = "./upload.file"

    # 下载文件
    download_file(hostname, username, password, remote_path, local_path)
    # 上传文件    
    upload_file(hostname, username, password, remote_path_upload, local_path_upload)

Wireshark报文

抓包可以看出TCP三次握手,并且使用SSHv2 paramiko进行连接,然后交换密钥key,最后实现文件的加密传输。在客户端(IP .56)执行python代码,从服务器端(IP .86)下载源文件到客户端目标路径。

根据实测,每次下载的文件分片大小为32768bytes,和paramiko(SSHv2/SFTP)定义一致。

 RFC 4253 - The Secure Shell (SSH) Transport Layer Protocol

6.1.  Maximum Packet Length

   All implementations MUST be able to process packets with an
   uncompressed payload length of 32768 bytes or less and a total packet
   size of 35000 bytes or less (including 'packet_length',
   'padding_length', 'payload', 'random padding', and 'mac').  The
   maximum of 35000 bytes is an arbitrarily chosen value that is larger
   than the uncompressed length noted above.  Implementations SHOULD
   support longer packets, where they might be needed.  For example, if
   an implementation wants to send a very large number of certificates,
   the larger packets MAY be sent if the identification string indicates
   that the other party is able to process them.  However,
   implementations SHOULD check that the packet length is reasonable in
   order for the implementation to avoid denial of service and/or buffer
   overflow attacks.
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值