paramiko模块介绍

一、介绍
Paramiko 是 Python 中用于实现 SSH 远程登录 和 SFTP 文件传输 的核心模块,简单说就是 “用 Python 代码代替手动敲 SSH 命令”, 比如远程执行服务器命令、上传 / 下载文件 核心功能: 1. SSH 远程执行命令(比如 ls、mkdir、python run.py); 2. SFTP 上传 / 下载文件(比 scp 命令更灵活); 3. 支持密钥登录(比密码登录更安全)。

安装:pip install paramiko

二、功能介绍
2.1、ssh远程连接
# 导入 paramiko 模块
import paramiko

# 1. 创建 SSH 客户端对象
ssh = paramiko.SSHClient()

try:
    # 2. 首次连接服务器时,SSH 会提示 “是否信任该主机”,这行代码让 Python 自动信任,不用手动确认
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    # 3. 连接服务器(核心参数)
    ssh.connect(
        hostname='你的服务器IP',  # 比如 192.168.1.100
        port=22,                 # SSH 默认端口是 22,不用改
        username='服务器用户名',  # 比如 root、ubuntu
        password='服务器密码'     # 你的服务器登录密码
    )

    # 4. 执行远程命令(比如查看服务器当前目录文件)
    # exec_command 返回 3 个文件对象:标准输入、标准输出、标准错误
    stdin, stdout, stderr = ssh.exec_command('ls -l')

    如果是多条命令:
    # 拼接多条命令:&& 表示前一条成功才执行后一条;; 表示不管前一条是否成功都执行
    cmd = 'cd /home/ubuntu && mkdir test_dir && ls -l'
    stdin, stdout, stderr = ssh.exec_command(cmd)

    # 5. 读取执行结果(stdout 是正确输出,stderr 是错误输出)
    # 解码:把字节转成字符串,指定编码(服务器一般是 utf-8)
    result = stdout.read().decode('utf-8')
    error = stderr.read().decode('utf-8')

    # 6. 打印结果
    if result:
        print("命令执行成功,结果:")
        print(result)
    if error:
        print("命令执行出错,错误信息:")
        print(error)

except Exception as e:
    # 捕获所有异常(比如连接失败、密码错误)
    print(f"连接/执行命令失败:{e}")

finally:
    # 7. 无论成功失败,最后关闭连接(避免占用资源)
    ssh.close()
2.2、SFTP 上传 / 下载文件

Paramiko 的 SFTP 功能可以实现 “本地 ↔ 远程服务器” 的文件传输,比 scp 命令更灵活(支持断点续传、批量传输)

# 1、上传文件,本地 -- 》服务器
import paramiko

# 1. 先建立 SSH 连接(和之前一样)
transport = paramiko.Transport()
try:
    # 2. 认证登录
    transport.connect(hostname='ip', port=22, username='用户名', password='密码')

    # 3. 创建 SFTP 客户端对象
    sftp = paramiko.SFTPClient.from_transport(transport)

    # 4. 上传文件
    # 参数1:本地文件路径(比如 ./test.txt)
    # 参数2:服务器保存路径(比如 /home/ubuntu/test.txt)
    local_path = './test.txt'  # 本地当前目录的 test.txt
    remote_path = '/home/ubuntu/test.txt'  # 服务器保存路径
    sftp.put(local_path, remote_path)
    print(f"文件 {local_path} 上传到 {remote_path} 成功!")

except Exception as e:
    print(f"上传失败:{e}")
finally:
    # 5. 关闭连接
    transport.close()


# 2、下载文件,远程服务器 -- 》本地
import paramiko

transport = paramiko.Transport()
try:
    transport.connect(hostname='ip', port=22, username='用户名', password='密码')

    # 下载文件:get(服务器文件路径, 本地保存路径)
    remote_path = '/home/ubuntu/test.txt'  # 服务器文件
    local_path = './download_test.txt'    # 本地保存的文件名
    sftp.get(remote_path, local_path)
    print(f"文件 {remote_path} 下载到 {local_path} 成功!")

except Exception as e:
    print(f"下载失败:{e}")
finally:
    transport.close()
三、更安全:密钥登录(替代密码)

生产环境中不建议用密码登录(容易泄露),推荐用 SSH 密钥对登录

# 1、生成 SSH 密钥对(本地),就像Linux ssh远程连接 一样
ssh-keygen -t rsa

# 2、把公钥上传到远程服务器
把 id_rsa.pub 里的内容复制到服务器的 ~/.ssh/authorized_keys 文件中

# 3、Paramiko 用密钥登录(代码示例)
import paramiko

1. 加载本地私钥
private_key = paramiko.RSAKey.from_private_key_file('/Users/你的用户名/.ssh/id_rsa')

2. 建立连接
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
    ssh.connect(
        hostname='服务器IP',
        port=22,
        username='用户名',
        pkey=private_key  # 用私钥替代密码
    )

    # 执行命令(和之前一样)
    stdin, stdout, stderr = ssh.exec_command('uname -a')
    print(stdout.read().decode('utf-8'))
except Exception as e:
    print(f"登录失败:{e}")
finally:
    ssh.close()
posted @ 2025-12-11 18:13  有形无形  阅读(0)  评论(0)    收藏  举报