返回

如何用 Python 和私钥顺畅访问启用身份验证的 SFTP 服务器

python

如何用 Python 和私钥访问 SFTP 服务器

引言

远程文件传输协议(SFTP)是一种安全的协议,用于在客户端和服务器之间传输文件。当 SFTP 服务器启用身份验证时,你需要提供用户名、密码和私钥才能访问。使用 Python 访问启用身份验证的 SFTP 服务器需要用到 paramiko 或 pysftp 模块。虽然这两个模块都很出色,但它们在处理密码和私钥身份验证时都有局限性。本文将深入探讨如何解决这些局限性,并提供一个完整的解决方案,让你可以顺利使用 Python 和私钥访问 SFTP 服务器。

问题:密码和私钥身份验证

在使用 paramiko 模块时,你会发现它无法同时考虑密码和私钥。pysftp 模块虽然支持私钥身份验证,但它不提供一种简单的方法来同时使用密码。这给同时需要密码和私钥身份验证的场景带来了挑战。

解决方案:paramiko 中的 AuthHandler

paramiko 提供了一个称为 AuthHandler 的类,它允许你组合多个身份验证方法。通过使用 AuthHandler,你可以创建一个包含密码和私钥身份验证处理器的身份验证处理器。以下是如何实现:

import paramiko

# 创建一个 SSHClient 对象
client = paramiko.client.SSHClient()

# 设置自动接受服务器密钥策略
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 创建一个密码认证处理器
password_handler = paramiko.PasswordHandler()
password_handler.add_password('sftp.exmple.com', 'username', 'password')

# 创建一个私钥认证处理器
private_key_handler = paramiko.SSHClient.load_private_key_file('private_key_path')

# 创建一个身份验证处理器,包含密码和私钥认证处理器
auth_handler = paramiko.AuthenticationHandler()
auth_handler.add_handler(password_handler)
auth_handler.add_handler(private_key_handler)

# 使用身份验证处理器连接到服务器
client.connect('sftp.exmple.com', username='username', port=22, auth_handler=auth_handler)

这种方法使你能够使用密码和私钥对 SFTP 服务器进行身份验证。

代码示例

完整的代码示例如下:

import paramiko

password = 'password'
private_key_path = 'private_key_path'

# 创建一个 SSHClient 对象
client = paramiko.client.SSHClient()

# 设置自动接受服务器密钥策略
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 创建一个密码认证处理器
password_handler = paramiko.PasswordHandler()
password_handler.add_password('sftp.exmple.com', 'username', password)

# 创建一个私钥认证处理器
private_key_handler = paramiko.SSHClient.load_private_key_file(private_key_path)

# 创建一个身份验证处理器,包含密码和私钥认证处理器
auth_handler = paramiko.AuthenticationHandler()
auth_handler.add_handler(password_handler)
auth_handler.add_handler(private_key_handler)

# 使用身份验证处理器连接到服务器
client.connect('sftp.exmple.com', username='username', port=22, auth_handler=auth_handler)

# 打开 SFTP 会话
sftp = client.open_sftp()

结论

通过使用 paramiko 模块中的 AuthHandler 类,你可以轻松地在 Python 中结合密码和私钥进行 SFTP 身份验证。这种方法为同时需要两种身份验证方法的场景提供了一个有效的解决方案。通过遵循本文提供的步骤,你可以轻松连接到启用身份验证的 SFTP 服务器,安全地管理远程文件。

常见问题解答

1. 我应该使用 paramiko 还是 pysftp 模块进行 SFTP 身份验证?

  • 如果需要同时使用密码和私钥进行身份验证,则 paramiko 是首选。

2. 如何配置私钥文件?

  • 确保私钥文件具有适当的权限,并且 SFTP 服务器已配置为接受该私钥。

3. 如何处理服务器密钥验证错误?

  • 使用 AutoAddPolicy 策略自动接受服务器密钥。

4. AuthHandler 可以包含哪些其他身份验证方法?

  • AuthHandler 可以包含键盘交互身份验证、GSSAPI 身份验证等其他方法。

5. 如何在生产环境中使用此解决方案?

  • 采取适当的措施保护密码和私钥,例如使用安全存储机制和限制对私钥文件的访问。