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

打印 上一主题 下一主题

主题 1853|帖子 1853|积分 5559

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x

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

一、使用 Paramiko 实行 SSH 远程下令

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

可以使用 pip 下令来安装:
  1. pip install paramiko
复制代码
2、导入 Paramiko 模块

在 Python 脚本中导入 Paramiko 模块:
  1. import paramiko
复制代码
3、连接到远程服务器

创建一个 SSHClient 对象,并使用 connect() 方法连接到远程服务器:
  1. # 创建 SSHClient 对象
  2. ssh_client = paramiko.SSHClient()
  3. # 添加远程服务器的主机密钥(如果首次连接,需要添加)
  4. ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  5. # 连接到远程服务器
  6. ssh_client.connect(hostname='your_remote_server', port=22, username='your_username', password='your_password')
复制代码
4、实行远程下令

使用 exec_command() 方法实行远程下令:
  1. # 执行远程命令
  2. stdin, stdout, stderr = ssh_client.exec_command('ls -l')
  3. # 读取命令执行结果
  4. output = stdout.read().decode('utf-8')
  5. error = stderr.read().decode('utf-8')
  6. # 打印执行结果或错误信息
  7. print("Command Output:", output)
  8. print("Command Error:", error)
复制代码
5、关闭 SSH 连接

实行完远程下令后,记得关闭 SSH 连接:
  1. # 关闭 SSH 连接
  2. ssh_client.close()
复制代码
6、示例

下面是一个完整的示例,演示了如何使用 Paramiko 实行 SSH 远程下令:
  1. import paramiko
  2. # 远程服务器的信息hostname = 'your-remote-server'port = 22username = '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 模块:
  1. import paramiko
复制代码
2、连接到远程服务器

创建一个 SSHClient 对象,并使用 connect() 方法连接到远程服务器:
  1. # 创建 SSHClient 对象
  2. ssh_client = paramiko.SSHClient()
  3. # 添加远程服务器的主机密钥(如果首次连接,需要添加)
  4. ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  5. # 连接到远程服务器
  6. ssh_client.connect(hostname='your_remote_server', port=22, username='your_username', password='your_password')
复制代码
3、创建 SFTP 客户端

通过 SSHClient 的 open_sftp() 方法创建 SFTP 客户端:
  1. # 创建 SFTP 客户端
  2. sftp_client = ssh_client.open_sftp()
复制代码
4、实行 SFTP 操作

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

使用 put() 方法上传本地文件到远程服务器:
  1. local_file = '/path/to/local/file.txt'
  2. remote_file = '/path/to/remote/file.txt'
  3. sftp_client.put(local_file, remote_file)
复制代码
下载文件

使用 get() 方法从远程服务器下载文件到本地:
  1. remote_file = '/path/to/remote/file.txt'
  2. local_file = '/path/to/local/file.txt'
  3. sftp_client.get(remote_file, local_file)
复制代码
创建目录

使用 mkdir() 方法在远程服务器上创建目录:
  1. remote_dir = '/path/to/remote/directory'
  2. sftp_client.mkdir(remote_dir)
复制代码
删除文件

使用 remove() 方法删除远程服务器上的文件:
  1. remote_file = '/path/to/remote/file.txt'
  2. sftp_client.remove(remote_file)
复制代码
5、关闭 SFTP 连接

实行完 SFTP 操作后,记得关闭 SFTP 连接:
  1. # 关闭 SFTP 连接
  2. sftp_client.close()
复制代码
 6、关闭 SSH 连接

末了,关闭 SSH 连接:
  1. # 关闭 SSH 连接
  2. ssh_client.close()
复制代码
7、示例

以下是一个完整的示例,演示了如何使用 Paramiko 进行 SFTP 文件传输:
  1. import paramiko
  2. # 远程服务器的信息hostname = 'your-remote-server'port = 22username = '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 远程下令与文件的函数封装

  1. # -*- coding: utf-8 -*-import paramiko
  2. import threadingimport 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 = 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) 方法连接到服务器。
  1. from ftplib import FTP
  2. ftp = FTP()
  3. ftp.connect('ftp.example.com', 21)
复制代码
2、登录到 FTP 服务器

        成功连接到 FTP 服务器后,需要登录以进行后续操作。可以使用 login(user, passwd) 方法登录到服务器。
  1. ftp.login('username', 'password')
复制代码
3、获取目录列表

可以使用 nlst() 方法获取当前目录的文件列表。
  1. file_list = ftp.nlst()
  2. print(file_list)
复制代码
4、切换目录

可以使用 cwd(path) 方法切换到指定的目录。
  1. ftp.cwd('/path/to/directory')
复制代码
5、下载文件

要从服务器下载文件,可以使用 retrbinary(command, callback, blocksize, rest) 方法。
  1. local_filename = 'file_to_download.txt'
  2. with open(local_filename, 'wb') as file:
  3.     ftp.retrbinary('RETR file_to_download.txt', file.write)
复制代码
6、上传文件

要将文件上传到服务器,可以使用 storbinary(command, file, blocksize, callback, rest) 方法。
  1. local_filename = 'file_to_upload.txt'
  2. with open(local_filename, 'rb') as file:
  3.     ftp.storbinary('STOR file_to_upload.txt', file)
复制代码
7、删除文件

可以使用 delete(filename) 方法从服务器上删除文件。
  1. ftp.delete('file_to_delete.txt')
复制代码
8、断开连接

完成全部操作后,记得断开与服务器的连接。
  1. ftp.quit()
复制代码
9、示例

以下是一个完整的示例,演示了如何使用 Python 的 ftplib 模块访问 FTP 服务:
  1. 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')
  2. # 上传文件到服务器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()
  3. print("FTP连接已断开")
复制代码
        以上是对 ftplib 模块的介绍。使用这个模块,可以轻松地编写 Python 脚本来管理 FTP 服务器上的文件。请留意,在使用 ftplib 模块时要鉴戒处置惩罚敏感信息(如用户名和暗码),以确保安全性。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莫张周刘王

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表