首页 > Python资料 博客日记
Python中的SSH、SFTP和FTP操作详解
2024-08-06 06:00:05Python资料围观50次
大家好,在网络编程中,安全地连接到远程服务器并执行操作是一项常见任务。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
模块时要小心处理敏感信息(如用户名和密码),以确保安全性。
标签:
相关文章
最新发布
- 【Python】selenium安装+Microsoft Edge驱动器下载配置流程
- Python 中自动打开网页并点击[自动化脚本],Selenium
- Anaconda基础使用
- 【Python】成功解决 TypeError: ‘<‘ not supported between instances of ‘str’ and ‘int’
- manim边学边做--三维的点和线
- CPython是最常用的Python解释器之一,也是Python官方实现。它是用C语言编写的,旨在提供一个高效且易于使用的Python解释器。
- Anaconda安装配置Jupyter(2024最新版)
- Python中读取Excel最快的几种方法!
- Python某城市美食商家爬虫数据可视化分析和推荐查询系统毕业设计论文开题报告
- 如何使用 Python 批量检测和转换 JSONL 文件编码为 UTF-8
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Python与PyTorch的版本对应
- Anaconda版本和Python版本对应关系(持续更新...)
- Python pyinstaller打包exe最完整教程
- Could not build wheels for llama-cpp-python, which is required to install pyproject.toml-based proj