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. 安全最佳实践
- 替代 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())
- 禁用弱加密算法
指定安全算法:
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















暂无评论内容