Python Paramiko库:SSH远程连接与文件传输实战指南

更多资料获取

📚 个人网站:ipengtao.com


在网络管理和系统运维中,SSH(Secure Shell)是一种广泛用于远程登录和文件传输的协议。Python中的Paramiko库为开发者提供了灵活、强大的SSH客户端和服务器功能。本文将深入探讨Paramiko库的使用,通过详细的示例代码,帮助读者理解如何在Python中进行SSH远程连接和文件传输。

安装Paramiko库

首先,确保已经安装了Paramiko库。可以使用以下命令进行安装:

pip install paramiko

SSH远程连接

使用Paramiko建立SSH远程连接的过程非常简单。

以下是一个基本的SSH连接示例:

import paramiko# 设置SSH连接参数
hostname = 'your_remote_host'
port = 22
username = 'your_username'
password = 'your_password'# 创建SSH客户端
client = paramiko.SSHClient()# 自动添加主机密钥
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 连接远程主机
client.connect(hostname, port, username, password)# 执行远程命令
stdin, stdout, stderr = client.exec_command('ls -l')# 打印命令输出
print(stdout.read().decode())# 关闭SSH连接
client.close()

这个示例中,通过paramiko.SSHClient创建了一个SSH客户端,使用connect方法连接远程主机,然后通过exec_command方法执行了一个远程命令,并打印了命令的输出。

文件传输

Paramiko还提供了便捷的文件传输功能,可以轻松实现文件的上传和下载。

以下是一个文件上传的示例:

import paramiko# 设置SSH连接参数
hostname = 'your_remote_host'
port = 22
username = 'your_username'
password = 'your_password'# 创建SSH传输通道
transport = paramiko.Transport((hostname, port))
transport.connect(username=username, password=password)# 创建SFTP客户端
sftp = paramiko.SFTPClient.from_transport(transport)# 上传本地文件到远程主机
local_path = 'local_file.txt'
remote_path = 'remote_file.txt'
sftp.put(local_path, remote_path)# 关闭SFTP连接
sftp.close()# 关闭SSH传输通道
transport.close()

在这个示例中,通过paramiko.Transport创建了一个SSH传输通道,然后使用paramiko.SFTPClient从传输通道创建了一个SFTP客户端。通过put方法,我们将本地文件上传到远程主机。

进阶应用:使用SSH密钥进行连接

Paramiko还支持使用SSH密钥进行连接,提高了安全性。

以下是一个使用SSH密钥的连接示例:

import paramiko# 设置SSH连接参数
hostname = 'your_remote_host'
port = 22
username = 'your_username'
private_key_path = '/path/to/your/private/key'# 创建SSH客户端,加载私钥文件
private_key = paramiko.RSAKey(filename=private_key_path)
client = paramiko.SSHClient()# 自动添加主机密钥
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 连接远程主机,使用SSH密钥进行身份验证
client.connect(hostname, port, username, pkey=private_key)# 执行远程命令
stdin, stdout, stderr = client.exec_command('ls -l')# 打印命令输出
print(stdout.read().decode())# 关闭SSH连接
client.close()

在这个示例中,使用paramiko.RSAKey加载了本地的私钥文件,并在连接时通过pkey参数指定了私钥。这样,就实现了使用SSH密钥进行连接的操作。

文件下载与目录同步

除了上传文件,Paramiko还支持从远程主机下载文件和同步目录。

以下是一个文件下载和目录同步的示例:

import paramiko# 设置SSH连接参数
hostname = 'your_remote_host'
port = 22
username = 'your_username'
password = 'your_password'# 创建SSH传输通道
transport = paramiko.Transport((hostname, port))
transport.connect(username=username, password=password)# 创建SFTP客户端
sftp = paramiko.SFTPClient.from_transport(transport)# 下载远程文件到本地
remote_file_path = 'remote_file.txt'
local_file_path = 'local_file.txt'
sftp.get(remote_file_path, local_file_path)# 同步远程目录到本地
remote_dir_path = 'remote_directory'
local_dir_path = 'local_directory'
sftp.get_r(remote_dir_path, local_dir_path)# 关闭SFTP连接
sftp.close()# 关闭SSH传输通道
transport.close()

在这个示例中,使用get方法将远程文件下载到本地,并使用get_r方法同步整个远程目录到本地。

多个命令的批量执行

Paramiko允许批量执行多个命令,这在一次SSH连接中执行多个任务时非常有用。

以下是一个批量执行多个命令的示例:

import paramiko# 设置SSH连接参数
hostname = 'your_remote_host'
port = 22
username = 'your_username'
password = 'your_password'# 创建SSH客户端
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname, port, username, password)# 定义多个要执行的命令
commands = ['ls -l','echo "Hello, World!"','df -h'
]# 执行多个命令
for command in commands:stdin, stdout, stderr = client.exec_command(command)print(f"Command: {command}")print(stdout.read().decode())# 关闭SSH连接
client.close()

这个示例中,定义了一个包含多个命令的列表,然后通过循环执行每个命令,逐一打印执行结果。

异常处理机制

在实际应用中,异常处理是保障代码稳定性和可靠性的关键部分。当涉及到远程连接、文件传输等网络操作时,异常处理尤为重要。以下是一些常见的异常处理场景和相应的处理方式:

1. 网络连接异常

import paramiko
from paramiko import SSHExceptiontry:# 尝试建立SSH连接client = paramiko.SSHClient()client.set_missing_host_key_policy(paramiko.AutoAddPolicy())client.connect('remote_host', username='username', password='password')# 执行其他操作...except SSHException as e:print(f"SSH Connection Error: {e}")finally:# 确保连接关闭if client:client.close()

2. 文件不存在异常(SFTP)

import paramiko
from paramiko import SFTPErrortry:transport = paramiko.Transport(('remote_host', 22))transport.connect(username='username', password='password')# 创建SFTP客户端sftp = paramiko.SFTPClient.from_transport(transport)# 尝试下载远程文件sftp.get('remote_file.txt', 'local_file.txt')except FileNotFoundError as e:print(f"File Not Found Error: {e}")finally:# 关闭SFTP连接if sftp:sftp.close()# 关闭SSH传输通道if transport:transport.close()

提高安全性:使用SSH密钥进行连接

明文密码在传输过程中存在安全风险,因此建议使用SSH密钥进行连接,提高安全性。以下是一个使用SSH密钥的连接示例:

import paramiko# 设置SSH连接参数
hostname = 'your_remote_host'
port = 22
username = 'your_username'
private_key_path = '/path/to/your/private/key'# 创建SSH客户端,加载私钥文件
private_key = paramiko.RSAKey(filename=private_key_path)
client = paramiko.SSHClient()# 自动添加主机密钥
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())try:# 连接远程主机,使用SSH密钥进行身份验证client.connect(hostname, port, username, pkey=private_key)# 执行其他操作...except paramiko.AuthenticationException as e:print(f"Authentication Error: {e}")finally:# 关闭SSH连接client.close()

总结

在本文中,研究了Python中的Paramiko库,这是一款功能丰富的工具,用于实现SSH远程连接和文件传输。通过详细的示例代码,覆盖了从基本的SSH连接、文件上传和下载,到高级的目录同步、多命令批量执行等方面的应用场景。

为了保证代码的稳健性,强调了异常处理的重要性,特别是在涉及网络连接和文件操作时。通过合适的异常处理机制,能够更好地应对可能的错误情况,提高程序的可靠性。同时,在安全性方面,推荐了使用SSH密钥进行连接,而不是明文密码。这种做法不仅提高了远程连接的安全性,还有助于降低密码泄漏的风险。

总体而言,Paramiko库为Python开发者提供了强大的工具,使得处理SSH操作变得轻松而高效。通过深入理解并巧妙应用Paramiko的各项功能,开发者可以在网络管理、系统运维等方面取得更大的成就。


Python学习路线

在这里插入图片描述

更多资料获取

📚 个人网站:ipengtao.com

如果还想要领取更多更丰富的资料,可以点击文章下方名片,回复【优质资料】,即可获取 全方位学习资料包。

在这里插入图片描述
点击文章下方链接卡片,回复【优质资料】,可直接领取资料大礼包。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/219093.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Codeforces Round 912 (Div. 2)

Codeforces Round 912 (Div. 2) A 大等于2依据冒泡排序即可排序&#xff0c;因此判断下1即可 #include <bits/stdc.h>using namespace std;const int N 1e5 10; int a[N];void solve() {int n , m;cin >> n >> m;for(int i 1 ; i < n ; i ){cin >…

有哪些话一听就知道一个程序员是个水货?

前端&#xff1a;你给我传个时间戳吧。 我&#xff1a;什么是时间戳&#xff1f; 前端&#xff1a;啊&#xff1f; 我&#xff1a;哦哦。我自己百度吧。

改dns会有什么影响?

改变DNS&#xff08;Domain Name System&#xff09;会对网络连接和域名解析产生影响。下面是一些可能的影响&#xff1a; 域名解析速度&#xff1a;DNS服务器的选择和性能可能会影响域名解析的速度。如果你更改为更快的DNS服务器&#xff0c;域名解析时间可能会缩短&#xff0…

LeetCode922. Sort Array By Parity II

文章目录 一、题目二、题解 一、题目 Given an array of integers nums, half of the integers in nums are odd, and the other half are even. Sort the array so that whenever nums[i] is odd, i is odd, and whenever nums[i] is even, i is even. Return any answer a…

LeetCode刷题--- 验证二叉搜索树

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 http://t.csdnimg.cn/ZxuNL个人专栏&#xff1a;力扣递归算法题 http://t.csdnimg.cn/ZxuNL 【C】 http://t.csdnimg.cn/c9twt 前言&#xff1a;这个专栏主要讲述递归递归、搜索与回溯算法&#x…

分享5款不起眼但非常实用的小工具

​ 时光荏苒&#xff0c;科技日新月异&#xff0c;一些看似不起眼的小工具却可能改变我们的工作方式。下面我们将介绍五款不可错过的小工具&#xff0c;它们能给你带来一些意想不到的效果&#xff0c;让你的工作更加高效便捷。 1.音乐播放——洛雪音乐助手 ​ 洛雪音乐助手是…

什么是原子性?

Lindaaker explained that ‘atomic’ comes from Greek and meaning ‘undividable.’ 参考&#xff1a; JavaOne 2012: How Do Non-Blocking Data Structures Work? 参考&#xff1a; JavaOne 2012: How Do Non-Blocking Data Structures Work? 中文翻译 原子&#xff08;…

No module named ‘osgeo’解决办法

from osgeo import gdal 报错&#xff1a;No module named ‘osgeo’ pycharm安装osgeo、GDAL都失败 pip install osgeo失败 最后先下载对应版本的GDAL文件 再cmd命令行中用对应环境的python进行GDAL包安装 1.我将我的Anaconda某个环境文件夹D:\software\pinstall\Anaconda3…

Source Tree回滚 重置 贮藏操作

回滚提交 source tree的回滚提交: 在执行该操作时将会对history中提交的指定节点直接进行回滚,将该节点执行的提交操作撤销(如当前节点是提交文件,执行回滚提交时将会删除该文件,如果当前节点的前面的节点对该节点内容进行修改后,执行回滚提交时需要执行冲突解决),同时生成一次…

【算法集训】基础数据结构:六、栈和队列

做这几天的数据结构的题目的时候有很多函数需要填写&#xff0c;这里需要有一个大致的顺序&#xff0c;一般是先补全结构体&#xff0c;也就是创建队列 | 栈&#xff1b; 而后初始化&#xff0c;设置初值create&#xff08;&#xff09;函数&#xff0c;再然后C语言需要释放&am…

常见的响应状态码

状态码英文描述解释200OK客户端请求成功&#xff0c;即处理成功&#xff0c;这是我们最想看到的状态码302Found指示所请求的资源已移动到由Location响应头给定的 URL&#xff0c;浏览器会自动重新访问到这个页面304Not Modified告诉客户端&#xff0c;你请求的资源至上次取得后…

【MyBatis】拦截查询结果同时动态替换

说明 项目中需要用到响应时替换某些字段的某些值。 代码 package xxx.xxx.xx;import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.cache.CacheKey; import org.apach…

智能优化算法应用:基于蜻蜓算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于蜻蜓算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于蜻蜓算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蜻蜓算法4.实验参数设定5.算法结果6.参考文献7.MA…

【音视频 | H.264】H.264编码详解

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

使用FluentAvalonia组件库快速完成Avalonia前端开发

前言 工欲善其事必先利其器,前面我们花了几篇文章介绍了Avalonia框架以及如何在Avalonia框架下面使用PrismAvalonia完成MVV模式的开发。今天我们将介绍一款重磅级的Avalonia前端组件库,里面封装了我们开发中常用的组件,这样就不用我们自己再写组件了。专注业务功能开发,提…

1.4 Postman的安装

hello大家好&#xff0c;本小节我们来安装一下Postman&#xff0c;好为我们后续的测试工作做准备。 首先&#xff0c;打开Postman的官网Postman API Platform 然后根据同学们自己电脑的操作系统来下载对应的Postman安装包。我这里拿windows来举例。我们点击windows的图标 会跳…

Qt 剪贴板操作

Qt剪贴板操作 剪贴板的操作经常和前面所说的拖放技术在一起使用,因此我们现在先来说说剪贴板的相关操作。大家对剪贴板都很熟悉。我们可以简单的把它理解成一个数据的存储池,可以把外面的数据放置进去,也可以把里面的数据取出来。剪贴板是由操作系统维护的,所以这提供了跨…

常见的计算机图片格式

左rgb &#xff08;光源色彩&#xff09; 右cmyk &#xff08;印刷色彩&#xff09; 缺点&#xff0c;不能保存&#xff0c;储存空间太大

我对前端/互联网发展的一些看法

写在前面 看这篇文章的标题你们估计也想到了,我就是单纯的水一篇文章,但是以我的尿性也不可能完全水,毕竟我是一个主打实际的博主,我还是希望通过文章输出一些我对技术或者是生活的一些看法,既然是看法,那么就肯定有很多人持有不同的看法,不过我欢迎任何不同的声音,毕竟我也已经…

螺旋矩阵算法(leetcode第54题)

题目描述&#xff1a; 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。示例 1&#xff1a;输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a;输入&#xff…