Python中的SSH、SFTP和FTP操作详解

        大家好,在网络编程中,安全地连接到远程服务器并执行操作是一项常见任务。Python 提供了多种库来实现这一目标,其中 Paramiko 是一个功能强大的工具,可以轻松地在 Python 中执行 SSH、SFTP 和 FTP 操作。本文将介绍如何使用 Paramiko 库来进行这些操作。

一、使用 Paramiko 执行 SSH 远程命令

        使用 Python 的 Paramiko 模块可以方便地执行 SSH 远程命令。Paramiko 是一个纯 Python 实现的 SSHv2 协议,它提供了一个简单而强大的 API,可以连接到远程服务器并执行命令,以及传输文件等。

1、安装 Paramiko 模块

可以使用 pip 命令来安装:

pip install paramiko

2、导入 Paramiko 模块

在 Python 脚本中导入 Paramiko 模块:

import paramiko

3、连接到远程服务器

创建一个 SSHClient 对象,并使用 connect() 方法连接到远程服务器:

# 创建 SSHClient 对象
ssh_client = paramiko.SSHClient()# 添加远程服务器的主机密钥(如果首次连接,需要添加)
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 连接到远程服务器
ssh_client.connect(hostname='your_remote_server', port=22, username='your_username', password='your_password')

4、执行远程命令

使用 exec_command() 方法执行远程命令:

# 执行远程命令
stdin, stdout, stderr = ssh_client.exec_command('ls -l')# 读取命令执行结果
output = stdout.read().decode('utf-8')
error = stderr.read().decode('utf-8')# 打印执行结果或错误信息
print("Command Output:", output)
print("Command Error:", error)

5、关闭 SSH 连接

执行完远程命令后,记得关闭 SSH 连接:

# 关闭 SSH 连接
ssh_client.close()

6、示例

下面是一个完整的示例,演示了如何使用 Paramiko 执行 SSH 远程命令:

import paramiko# 远程服务器的信息
hostname = 'your-remote-server'
port = 22
username = 'your-username'
password = 'your-password'# 创建 SSHClient 对象
ssh_client = paramiko.SSHClient()try:# 添加远程服务器的主机密钥(如果首次连接,需要添加)ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 连接到远程服务器ssh_client.connect(hostname, port, username, password)# 执行远程命令command = 'ls -l'stdin, stdout, stderr = ssh_client.exec_command(command)# 获取命令执行结果output = stdout.read().decode('utf-8')error = stderr.read().decode('utf-8')if output:print("命令执行结果:")print(output)else:print("错误信息:")print(error)finally:# 关闭 SSH 连接ssh_client.close()

二、使用 Paramiko 的 SFTP

        Paramiko 的 SFTP(SSH 文件传输协议)功能使得在 Python 中进行安全文件传输变得非常简单。通过 SFTP,你可以连接到远程服务器,上传文件、下载文件、创建目录、删除文件等。

1、导入 Paramiko 模块

首先,在 Python 脚本中导入 Paramiko 模块:

import paramiko

2、连接到远程服务器

创建一个 SSHClient 对象,并使用 connect() 方法连接到远程服务器:

# 创建 SSHClient 对象
ssh_client = paramiko.SSHClient()# 添加远程服务器的主机密钥(如果首次连接,需要添加)
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 连接到远程服务器
ssh_client.connect(hostname='your_remote_server', port=22, username='your_username', password='your_password')

3、创建 SFTP 客户端

通过 SSHClient 的 open_sftp() 方法创建 SFTP 客户端:

# 创建 SFTP 客户端
sftp_client = ssh_client.open_sftp()

4、执行 SFTP 操作

现在,可以使用 SFTP 客户端执行各种操作,比如上传文件、下载文件、创建目录、删除文件等。以下是一些常见操作的示例:

上传文件

使用 put() 方法上传本地文件到远程服务器:

local_file = '/path/to/local/file.txt'
remote_file = '/path/to/remote/file.txt'
sftp_client.put(local_file, remote_file)

下载文件

使用 get() 方法从远程服务器下载文件到本地:

remote_file = '/path/to/remote/file.txt'
local_file = '/path/to/local/file.txt'
sftp_client.get(remote_file, local_file)

创建目录

使用 mkdir() 方法在远程服务器上创建目录:

remote_dir = '/path/to/remote/directory'
sftp_client.mkdir(remote_dir)

删除文件

使用 remove() 方法删除远程服务器上的文件:

remote_file = '/path/to/remote/file.txt'
sftp_client.remove(remote_file)

5、关闭 SFTP 连接

执行完 SFTP 操作后,记得关闭 SFTP 连接:

# 关闭 SFTP 连接
sftp_client.close()

 6、关闭 SSH 连接

最后,关闭 SSH 连接:

# 关闭 SSH 连接
ssh_client.close()

7、示例

以下是一个完整的示例,演示了如何使用 Paramiko 进行 SFTP 文件传输:

import paramiko# 远程服务器的信息
hostname = 'your-remote-server'
port = 22
username = 'your-username'
password = 'your-password'# 远程文件和本地文件的路径
remote_file_path = '/path/to/remote/file.txt'
local_file_path = '/path/to/local/file.txt'# 创建 SSHClient 对象
ssh_client = paramiko.SSHClient()try:# 添加远程服务器的主机密钥(如果首次连接,需要添加)ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 连接到远程服务器ssh_client.connect(hostname, port, username, password)# 创建 SFTP 客户端sftp_client = ssh_client.open_sftp()# 上传文件到远程服务器sftp_client.put(local_file_path, remote_file_path)print("文件成功上传到远程服务器")# 下载文件到本地sftp_client.get(remote_file_path, local_file_path)print("文件成功从远程服务器下载到本地")finally:# 关闭 SFTP 连接sftp_client.close()# 关闭 SSH 连接ssh_client.close()

三、Paramiko 远程命令与文件的函数封装

# -*- coding: utf-8 -*-
import paramiko
import threading
import logging as loggerlogger.basicConfig(level=logger.INFO)def remote_command(host_ip, host_port, username, password, command):"""远程执行Linux命令:param host_ip: 主机IP地址:type host_ip: str:param host_port: 主机SSH端口号:type host_port: int:param username: SSH用户名:type username: str:param password: SSH密码:type password: str:param command: 要执行的命令:type command: str"""client = Nonetry:# 创建SSH客户端client = paramiko.SSHClient()# 第一次SSH远程连接时会提示输入yes或者noclient.set_missing_host_key_policy(paramiko.AutoAddPolicy())client.connect(host_ip, host_port, username=username, password=password, timeout=10)logger.info(f"开始在远程服务器 {host_ip} 上执行命令: {command}")# 执行命令stdin, stdout, stderr = client.exec_command(command, get_pty=True)# 获取命令执行结果,返回的数据是一个字符串result = stdout.read().decode('utf-8')logger.info(f"{host_ip} 执行结果: {result}")error = stderr.read().decode('utf-8')if error != "":logger.info(f"{host_ip} 错误信息: {error}")else:passexcept Exception as e:logger.error(e)finally:client.close()def batch_remote_command(host_list, host_port, username, password, command):"""批量远程执行Linux命令:param host_list: 主机IP地址列表:type host_list: list:param host_port: 主机SSH端口号:type host_port: int:param username: SSH用户名:type username: str:param password: SSH密码:type password: str:param command: 要执行的命令:type command: str"""thread_list = []for ip in host_list:thread = threading.Thread(target=remote_command, args=(ip, host_port, username, password, command))# 将生成的线程添加到列表中thread_list.append(thread)for t in thread_list:# 开始执行线程t.start()for t in thread_list:# 挂起线程,等待所有线程结束t.join()def upload_file_to_remote_server(host, port, username, password, local_path, remote_path):"""上传文件从本地到远程服务器Args:host (str): 远程服务器的IP地址或主机名port (int): 远程服务器的端口username (str): 远程服务器的用户名password (str): 远程服务器的密码local_path (str): 本地文件路径,要上传的文件remote_path (str): 远程文件路径,上传的目标位置"""# 连接远程服务器ssh = paramiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh.connect(hostname=host, port=port, username=username, password=password)# 打开SFTP客户端sftp = ssh.open_sftp()# 上传本地文件至远程服务器sftp.put(local_path, remote_path)# 关闭SFTP客户端和SSH连接sftp.close()ssh.close()def download_file_from_remote_server(host, port, username, password, remote_path, local_path):"""从远程服务器下载文件到本地Args:host (str): 远程服务器的IP地址或主机名port (int): 远程服务器的端口username (str): 远程服务器的用户名password (str): 远程服务器的密码remote_path (str): 远程文件路径,要下载的文件local_path (str): 本地文件路径,下载的目标位置"""# 连接远程服务器ssh = paramiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh.connect(hostname=host, port=port, username=username, password=password)# 打开SFTP客户端sftp = ssh.open_sftp()# 下载远程服务器文件至本地sftp.get(remote_path, local_path)# 关闭SFTP客户端和SSH连接sftp.close()ssh.close()

四、使用 ftplib 访问 FTP 服务

    ftplib 是 Python 标准库中的一个模块,用于实现 FTP(文件传输协议)客户端。通过 ftplib 模块,你可以编写 Python 程序来连接到 FTP 服务器,上传文件、下载文件、列出目录等。

1、连接到 FTP 服务器

        要连接到 FTP 服务器,首先需要导入 ftplib 模块,然后使用 FTP 类创建一个 FTP 对象,并通过 connect(host, port) 方法连接到服务器。

from ftplib import FTPftp = FTP()
ftp.connect('ftp.example.com', 21)

2、登录到 FTP 服务器

        成功连接到 FTP 服务器后,需要登录以进行后续操作。可以使用 login(user, passwd) 方法登录到服务器。

ftp.login('username', 'password')

3、获取目录列表

可以使用 nlst() 方法获取当前目录的文件列表。

file_list = ftp.nlst()
print(file_list)

4、切换目录

可以使用 cwd(path) 方法切换到指定的目录。

ftp.cwd('/path/to/directory')

5、下载文件

要从服务器下载文件,可以使用 retrbinary(command, callback, blocksize, rest) 方法。

local_filename = 'file_to_download.txt'with open(local_filename, 'wb') as file:ftp.retrbinary('RETR file_to_download.txt', file.write)

6、上传文件

要将文件上传到服务器,可以使用 storbinary(command, file, blocksize, callback, rest) 方法。

local_filename = 'file_to_upload.txt'with open(local_filename, 'rb') as file:ftp.storbinary('STOR file_to_upload.txt', file)

7、删除文件

可以使用 delete(filename) 方法从服务器上删除文件。

ftp.delete('file_to_delete.txt')

8、断开连接

完成所有操作后,记得断开与服务器的连接。

ftp.quit()

9、示例

以下是一个完整的示例,演示了如何使用 Python 的 ftplib 模块访问 FTP 服务:

from ftplib import FTP# FTP 服务器的地址和端口
ftp_host = 'ftp.example.com'
ftp_port = 21# FTP 服务器的用户名和密码
ftp_username = 'your-username'
ftp_password = 'your-password'# 连接到 FTP 服务器
ftp = FTP()
ftp.connect(ftp_host, ftp_port)# 登录到 FTP 服务器
ftp.login(ftp_username, ftp_password)# 列出当前目录的文件列表
file_list = ftp.nlst()
print("当前目录的文件列表:", file_list)# 切换到指定目录
ftp.cwd('/path/to/directory')# 上传文件到服务器
local_filename = 'file_to_upload.txt'
remote_filename = 'uploaded_file.txt'
with open(local_filename, 'rb') as file:ftp.storbinary('STOR ' + remote_filename, file)print("文件成功上传到服务器")# 下载文件到本地
local_filename = 'downloaded_file.txt'
remote_filename = 'file_to_download.txt'
with open(local_filename, 'wb') as file:ftp.retrbinary('RETR ' + remote_filename, file.write)print("文件成功从服务器下载到本地")# 删除服务器上的文件
ftp.delete(remote_filename)
print("文件成功从服务器删除")# 断开与 FTP 服务器的连接
ftp.quit()
print("FTP连接已断开")

        以上是对 ftplib 模块的介绍。使用这个模块,可以轻松地编写 Python 脚本来管理 FTP 服务器上的文件。请注意,在使用 ftplib 模块时要小心处理敏感信息(如用户名和密码),以确保安全性。

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

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

相关文章

企业选择定制化MES管理系统时需要考虑的核心功能

在当今制造业的数字化转型浪潮中,企业对于实现生产现场透明管理的需求愈发迫切。为了满足这一需求,MES管理系统成为了众多企业的首选解决方案。MES管理系统以其高度的灵活性和可定制性,能够根据不同行业的特性,为企业提供量身定制…

看潮成长日程表用户手册(上)

看潮成长日程表用户手册(上) 一、特色功能1、以每周日程表为主要形式2、全时管控的时间管理3、持续的日程管理4、分期间时间表5、按日排程,按周输出6、夏季作息时间处理7、年度假日处理8、休息日处理9、弹性日程10、完成记录11、多种输出形式…

重构与优化-前言

关注公众号畅读:IT技术馆 Java代码重构是优化现有代码结构、提升代码可读性、可维护性和性能的过程,而不会改变其外在行为。这包括命名规范、消除重复代码、改进设计模式的使用、优化数据结构和算法等。下面是一些常见的Java代码重构技巧及示例: 1. 重命名(Rename) 目的…

光纤跳线组成结构划分你知道吗

按照组成结构划分 光纤跳线根据组成结构的不同可分为带状光纤跳线和束状光纤跳线。带状光纤跳线使用的是由光纤带组成的带状光缆,大多呈扁平形状,因具有较高的光纤密度,它可以容纳更多的纤芯,因此大大节省布线成本和空间&#xf…

猫咪掉毛严重怎么办?小米、希喂、霍尼韦尔宠物空气净化器测评

吸猫成瘾,养猫“致贫”?在当今社会,养猫已成为众多年轻人的一个追捧的事情。乖巧又可爱,下班回到家撸一把猫已经成为年轻人的日常。但是猫咪可爱也不影响它的各种养猫伴生的问题!无论是漂浮的浮毛、飘散的皮屑还是偶发…

2024年上半年系统架构设计师真题-复原程度90%

前言 此次考试监考特别严格,草稿纸不允许带出考场,并且准考证上不允许任何写画,甚至连笔都允许带一支,所以下面的相关题目都是参考一些群友的提供,加上自己的记忆回顾,得到的结果。 其中综合知识部分的题…

1.int 与 Integer 的简单区别

蓝桥杯刷题从此开始: 第一题就是两个数的和,个人看来主要考察 int与integer 的区别; 这是我提交的答案,竟然会报错: import java.util.*; //输入A、B,输出AB。 class add {public static void main(String …

yolov10 瑞芯微RKNN、地平线Horizon芯片部署、TensorRT部署,部署工程难度小、模型推理速度快

特别说明:参考官方开源的yolov10代码、瑞芯微官方文档、地平线的官方文档,如有侵权告知删,谢谢。 模型和完整仿真测试代码,放在github上参考链接 模型和代码。 yolov8、v9还没玩热乎,这不yolov10又来了,那么…

tomcat--安全配置多虚拟机

端口8005/tcp 安全配置管理 8005是Tomcat的管理端口,默认监听在127.0.0.1上。无需验证就可发送SHUTDOWN (大小写敏感)这个字符串,tomcat接收到后就会关闭此Server。此管理功能建议禁用,可将SHUTDOWN改为一串猜不出的字符串实现或者port修改成…

Java进阶学习笔记26——包装类

包装类: 包装类就是把基本类型的数据包装成对象。 看下API文档: deprecated:极力反对、不赞成的意思。 marked for removal:标识为去除的意思。 自动装箱:基本数据类型可以自动转换成包装类。 自动拆箱:…

前端怎么使用svg格式的图片

目录 第一步,找到图标 第二步,使用 第一种,SVG下载 第二种,粘贴SVG代码 第一步,找到图标 以阿里巴巴矢量图标库为例,随便找一个图标,如下图 第二步,使用 第一种,SV…

利用AI办公工具类API,大幅提高办公效率

AI办公工具类API是一项革命性的技术,利用人工智能的力量为办公场景提供了许多创新的解决方案。借助AI办公工具类API,用户可以实现自动化的文档处理、语音转文字、图像识别、数据分析等多种功能,大大提高了办公效率和工作质量。此外&#xff0…

突发!某大厂机房掉电,MySQL数据库无法启动,紧急恢复过程...

作者:IT邦德 中国DBA联盟(ACDU)成员,10余年DBA工作经验, Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主,全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复, 安装迁移,性能优化、故障…

Ubuntu18 配置FFmpeg开发环境 (Vscode+CMake)

关于Vscode插件安装不再赘述,本文主要讲解如何配置FFmpeg的开发环境以及CMake文件写法,如果不知道该安装什么插件请看本文: Ubuntu配置Vscode 文章目录 1.安装FFmpeg开发包2.配置Vscode项目3.使用C语言验证FFmpeg版本 1.安装FFmpeg开发包 更新…

宝塔部署前后端分离项目手册

文章目录 安装宝塔安装环境开始部署1. 前端Vue项目1.先本地启动前端项目(记住端口号)2.打包前端项目3.上传前端项目4.创建PHP站点5.安全里开放端口号6.测试前端 2. 后端boot项目1. 先在本地跑起来2.修改数据库的配置信息3. 项目打包4. nohup启动项目4.1 …

聊天软件鼻祖 ICQ 将于 6 月 26 日关闭;40 光年外发现一颗潜在宜居的类地行星丨 RTE 开发者日报 Vol.212

开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…

Vue3项目练习详细步骤(第一部分:项目构建,登录注册页面)

项目环境准备 工程创建 安装依赖 项目调整 注册功能 页面结构 接口文档 数据绑定和校验 数据接口调用 解决跨域问题 登录功能 接口文档 数据绑定和校验 数据接口调用 项目演示 项目的后端接口参考:https://blog.csdn.net/dafsq/category_12646722.html…

flutter使用dbus插件时,在终端无法使用“dart-dbus”命令

不用flutter的人,可能都不会找到这儿,遇到这个问题,所以这里默认flutter已经装过了,且对flutter如何使用插件也有所了解了。 由于我在项目中用到了dbus插件,用法如图所示,我需要使用这条命令来生成一个sou…

基于小波熵阈值的心电信号R波检测算法(MATLAB)

心脏兴奋电活动过程可由心电信号(ECG)来反映,心电信号也是医学上对心血管疾病诊断的重要科学依据。心电信号具有一定的随机性且一般情况下十分微弱,在信号采集、放大及变换过程中,心电信号容易受到人体呼吸及检测仪器等因素影响,从…

开发依赖与运行依赖

1. 概念 开发依赖:devDependencies 运行依赖:dependencies 2. 理解 (1)devDependencies 在线上状态不需要使用的依赖,就是开发依赖。为什么 npm 要把它单独分拆出来呢?最终目的是为了减少 node_modul…