【Python】Paramiko 库实现 SSH

SSH(Secure Shell)是远程管理服务器和执行命令的核心协议。Python 通过 paramiko 库提供了完整的 SSH 客户端功能,支持密码和密钥认证等多种连接方式。本文将深入解析 paramiko.SSHClient 的使用方法。


1. 安装 Paramiko

pip install paramiko

2. SSHClient 基础使用

SSHClient 是 Paramiko 的核心类,用于建立 SSH 连接并执行操作。

import paramiko

# 创建 SSH 客户端实例
client = paramiko.SSHClient()

# 自动添加主机密钥 (生产环境需谨慎)
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

3. 密码认证连接

通过用户名和密码建立连接:

try:
    client.connect(
        hostname='192.168.1.100',  # 服务器 IP
        port=22,                   # SSH 端口
        username='ubuntu',         # 用户名
        password='your_password'   # 密码
    )
    print("SSH 连接成功!")
    
    # 执行命令示例
    stdin, stdout, stderr = client.exec_command('ls -l')
    print(stdout.read().decode())
    
except paramiko.AuthenticationException:
    print("认证失败")
except paramiko.SSHException as e:
    print(f"连接错误: {str(e)}")
finally:
    client.close()  # 关闭连接

4. 密钥认证连接

使用私钥文件进行更安全的连接(推荐):

private_key = paramiko.RSAKey.from_private_key_file(
    filename='/path/to/private_key.pem'  # 私钥路径
)

client.connect(
    hostname='192.168.1.100',
    port=22,
    username='ubuntu',
    pkey=private_key  # 使用私钥认证
)

密钥注意事项

  • 私钥文件权限应为 600(Linux/Mac: chmod 600 key.pem)
  • 支持 RSA、ECDSA、Ed25519 等格式
  • 如需密码保护的密钥:private_key = paramiko.RSAKey.from_private_key_file( filename='key.pem', password='key_password' # 密钥的密码 )

5. 高级功能示例

SFTP 文件传输:

sftp = client.open_sftp()
# 上传文件
sftp.put('local_file.txt', '/remote/path/file.txt')
# 下载文件
sftp.get('/remote/path/file.txt', 'local_copy.txt')
sftp.close()

执行长时间命令:

# 获取交互式 shell
channel = client.invoke_shell()
channel.send("sudo apt update
")
channel.send("your_password
")  # 输入 sudo 密码
time.sleep(2)  # 等待命令执行
output = channel.recv(4096).decode()
print(output)

端口转发(SSH 隧道):

client.get_transport().open_channel(
    'direct-tcpip',
    ('localhost', 8080),  # 本地端口
    ('db.internal', 3306) # 远程目标
)

6. 安全最佳实践

  1. 替代 AutoAddPolicy
    生产环境应验证主机密钥:
# 方法1: 已知主机列表 client.load_system_host_keys() client.load_host_keys('~/.ssh/known_hosts') # 方法2: 自定义验证 class MyPolicy(paramiko.MissingHostKeyPolicy): def missing_host_key(self, client, hostname, key): if ask_user_verification(): return raise SSHException(f"未知主机 {hostname}") client.set_missing_host_key_policy(MyPolicy())
  1. 禁用弱加密算法
    指定安全算法:
client.connect(..., disabled_algorithms={ 'pubkeys': ['rsa-sha2-256', 'rsa-sha2-512']}, )

7. 完整示例代码

import paramiko

def ssh_connect(host, port, user, password=None, key_path=None):
    client = paramiko.SSHClient()
    client.load_system_host_keys()
    
    try:
        if key_path:
            key = paramiko.RSAKey.from_private_key_file(key_path)
            client.connect(host, port, user, pkey=key)
        else:
            client.connect(host, port, user, password)
            
        # 执行命令
        stdin, stdout, stderr = client.exec_command('df -h')
        print(stdout.read().decode())
        
        # SFTP 示例
        sftp = client.open_sftp()
        sftp.listdir('/')
        sftp.close()
        
    finally:
        client.close()

# 使用密钥连接
ssh_connect('192.168.1.100', 22, 'ubuntu', key_path='~/.ssh/id_rsa')

# 使用密码连接
ssh_connect('192.168.1.101', 22, 'admin', password='secure_pass')

8. 常见错误类型

错误类型

缘由

解决方案

AuthenticationException

用户名/密码/密钥错误

检查凭证有效性

SSHException

网络问题/协议错误

检查端口/防火墙/服务状态

BadHostKeyException

主机密钥不匹配

更新 known_hosts 或验证密钥

PasswordRequiredException

密钥需要密码但未提供

传递 password 参数


9. 总结

  • 密码认证:适合临时连接,但安全性较低
  • 密钥认证:生产环境首选,配合密钥密码更安全
  • 关键步骤:创建 SSHClient 实例设置主机密钥策略使用 connect() 建立连接执行命令或 SFTP 操作始终关闭连接

Paramiko 为 Python 提供了企业级的 SSH 实现,结合其 SFTP 和隧道功能,可轻松构建自动化运维工具、部署脚本和远程管理系统。提议优先使用密钥认证,并遵循主机密钥验证等安全实践以保障生产环境安全。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
用直线画个圆的头像 - 鹿快
评论 抢沙发

请登录后发表评论

    暂无评论内容