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

news2024/9/22 23:26:17

        大家好,在网络编程中,安全地连接到远程服务器并执行操作是一项常见任务。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 logger

logger.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 = None
    try:
        # 创建SSH客户端
        client = paramiko.SSHClient()
        # 第一次SSH远程连接时会提示输入yes或者no
        client.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:
            pass
    except 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 FTP

ftp = 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.coloradmin.cn/o/1702020.html

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

相关文章

动态规划-二维费用的背包问题

文章目录 1. 一和零(474)2. 盈利计划(879) 1. 一和零(474) 题目描述: 状态表示: 我们之前的01背包问题以及完全背包问题都是一维的,因为我们只有一个要求或者说是限制那…

IT技术 | 电脑蓝屏修复记录DRIVER_IRQL_NOT_LESS_OR_EQUAL

我的台式机是iMac 2015年的,硬盘是机械的,时间久了运行越来越慢。后来对苹果系统失去了兴趣,想换回windows,且想换固态硬盘,就使用winToGo 搞了双系统,在USB外接移动固态硬盘上安装了win10系统。 最近&…

安卓六种页面加载优化方案对比总结

根据工作经验,笔者提炼了六种页面加载优化方式,按照业务与非业务,将六种加载方式分为两类: 业务类 控制业务与UI的执行顺序、控制多业务之间的执行顺序 ①预加载:是指在进入页面之前,提前获得页面所需得数据…

2024经济管理、社会科学与教育国际会议(ICEMSSE 2024)

2024经济管理、社会科学与教育国际会议(ICEMSSE 2024) 会议简介 2024年国际经济管理、社会科学和教育会议(ICEMSSE 2024)专注于经济、社会发展和教育。会议旨在为专家、学者和社会人士提供一个交流平台。通过讨论科学研究成果和前沿技术,我…

浅谈配置元件之CSV 数据文件设置

浅谈配置元件之CSV 数据文件设置 为了增强测试的真实性和多样性,JMeter 提供了多种数据参数化的方式,其中 CSV 数据文件设置(CSV Data Set Config)是一种常用且强大的功能,它允许测试脚本从外部CSV文件中动态读取数据…

基于springboot+vue的“漫画之家”系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

Samtec mPower®电源连接器:高能、可靠、灵活、小巧

【摘要/前言】 电源连接器是互连解决方案中不可或缺的一个组成部分。虽然相较于比较爱“竞速”的信号连接器,电源连接器的技术迭代不是那么频繁,但是它是连接电源和用电设备的重要纽带,想要确保设备正常运行,就少不了它的身影。 …

EPSON RX8111CE+松下高性能电池的组合应用

RTC是一种实时时钟,用于记录和跟踪时间,具有独立供电和时钟功能。在某些应用场景中,为了保证RTC在断电或者其他异常情况下依然能够正常工作,需要备份电池方案来提供稳定的供电。本文将介绍EPSON爱普生nA级RTC RX8111CE松下Panason…

ESP32-C6构建Matter Wi-Fi和Thread终端设备的利器,启明云端乐鑫代理商

随着物联网技术的飞速发展,越来越多的智能设备开始融入我们的日常生活。在智能家居和智能家电领域,ESP32系列产品以其高性能的微控制器(MCU)和无线通信解决方案而深入人心。 作为乐鑫代理商,启明云端为广大开发者提供…

Python代码:十八、生成数字列表

1、描述 牛牛在牛客网系统录入了一连串数字,数字之间依靠逗号隔开,你能帮助他将这些数字存储在列表中吗,列表元素以int的形式。 输入描述: 输入一行整数,数字之间以空格间隔。 输出描述: 输出这些数字…

【5G NB-IoT NTN】基于IoT NTN实现卫星语音通信的关键技术研究

近年来,随着商业航天的兴起,卫星制造和发射成本大幅降低,星载天线技术快速发展,为卫星通信产业注入了新的活力。同时,随着通信芯片、终端能力的提升,基于星地网络融合的公众手持终端直连卫星逐步成为现实。…

超融合架构下,虚拟机高可用机制如何构建?

作者:SmartX 产品部 钟锦锌 虚拟机高可用(High Availability,简称 HA)是虚拟化/超融合平台最常用、关键的功能之一,可在服务器发生故障时通过重建业务虚拟机以降低故障对业务带来的影响。因此,为了充分保障…

什么是驾驶舱?这3种驾驶舱领导最爱看

在当今快速变化的商业环境中,企业决策者需要实时、准确地掌握企业运营的各个方面,以便迅速做出明智的决策。数据驾驶舱,作为一种先进的管理工具,正逐渐成为企业管理层的必备利器。本文将深入探讨数据驾驶舱的概念、类型、角色多维…

DAOS: A Scale-Out High Performance Storage Stack for Storage Class Memory——论文泛读

Supercomputing Frontiers 2020 Paper 分布式元数据论文阅读笔记整理 问题 企业、政府和学术界出现的数据密集型应用程序将现有的I/O模型扩展到了极限。现代I/O工作负载的特点是元数据与未对齐和碎片化数据的结合比例越来越高。传统的存储堆栈为这些工作负载提供了较差的性能…

从原理上解决 uniapp (含第三方插件)打包 iOS APP 失败的问题

最近一段时间,我的团队基于uniapp开发的平台型APP因平台资金合规的要求,需要对接中金支付,uniapp的插件市场有一个别人做好的中金支付插件,但前端开发同事在引用这个 插件时,出现了 iOS APP 打包不成功的情况&#xff…

通付盾Web3专题 | SharkTeam:Web3常见钓鱼方式分析与安全防范建议

引言 Web3钓鱼是一种针对Web3用户的常见攻击手段,通过各种方式窃取用户的授权、签名,或诱导用户进行误操作,目的是盗窃用户钱包中的加密资产。 近年来,Web3钓鱼事件不断出现,且发展出钓鱼即服务的黑色产业链&#xf…

python+pymysql对数据库进行增、删、改、查操作

一、概述 接口测试中,应用到数据库操作的场景: 1.校验测试数据 接口发送请求后明确会对数据库中的某个字段进行修改(编辑,更新、删除操作),但,响应结果中无该字段数据时。 例如:删…

QML-1- qml简介及项目创建

文章目录 1. QML 简介2. 项目创建3. 目录结构4. CMakeLists.txt 简单介绍5. 运行demo 1. QML 简介 根据官网介绍,qml 为qt一个模块,使用Qml语言开发应用程序和库提供了一个框架。它定义并实现了语言和引擎基础结构,并提供了一个API&#xff…

搭建属于自己的 Git 仓库:GitLab

搭建属于自己的 Git 仓库:使用 GitLab 文章目录 搭建属于自己的 Git 仓库:使用 GitLab什么是 GitLab?准备工作安装 Docker使用Docker Compose 快速构建GitLab1、从docker compose快速搭建GitLab2、部署到服务器并访问3、浏览器访问 在现代软件…