Python实现SSH免密登录
简介
在实际的开发工作中,我们经常需要在多台服务器之间进行操作,而每次都手动输入密码来进行登录会非常繁琐。为了简化这个过程,我们可以使用SSH免密登录来实现自动登录,提高工作效率。本文将介绍如何使用Python来实现SSH免密登录的步骤和代码。
SSH免密登录流程
下面的表格展示了SSH免密登录的整个流程:
步骤 | 描述 |
---|---|
生成密钥对 | 生成公钥和私钥 |
上传公钥 | 将公钥上传到目标服务器 |
配置服务器 | 在目标服务器上配置公钥登录 |
测试登录 | 使用Python进行免密登录测试 |
接下来,我们将逐步介绍每个步骤需要做什么,以及相应的代码和注释。
生成密钥对
首先,我们需要生成一对密钥,一把是公钥,一把是私钥。公钥可以被上传到目标服务器,私钥用于本地认证。
使用Python的paramiko
库可以轻松地生成密钥对。以下是生成密钥对的代码:
import paramiko
# 生成密钥对
key = paramiko.RSAKey.generate(2048)
# 保存私钥到本地文件
key.write_private_key_file('private.key')
# 打印公钥
print(key.get_base64())
代码说明:
paramiko.RSAKey.generate(2048)
用于生成长度为2048的RSA密钥对。key.write_private_key_file('private.key')
将私钥保存到本地文件private.key
。key.get_base64()
获取公钥的Base64字符串表示。
上传公钥
生成了公钥后,我们需要将其上传到目标服务器。可以使用SFTP协议来实现文件上传。
以下是上传公钥的代码:
import paramiko
# 连接目标服务器
ssh = paramiko.Transport(('host', 22))
ssh.connect(username='username', password='password')
# 创建SFTP客户端
sftp = ssh.open_sftp()
# 上传公钥
sftp.put('public.key', '/home/username/.ssh/authorized_keys')
# 关闭连接
sftp.close()
ssh.close()
代码说明:
paramiko.Transport(('host', 22))
用于建立SSH连接,其中host
为目标服务器的地址,22
为SSH默认端口。ssh.connect(username='username', password='password')
使用用户名和密码进行认证。ssh.open_sftp()
创建一个SFTP客户端。sftp.put('public.key', '/home/username/.ssh/authorized_keys')
上传公钥到目标服务器的~/.ssh/authorized_keys
文件中。sftp.close()
关闭SFTP连接。ssh.close()
关闭SSH连接。
配置服务器
上传公钥后,我们还需要在目标服务器上进行一些配置,以允许公钥登录。
以下是配置服务器的代码示例:
# 修改文件权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
代码说明:
chmod 700 ~/.ssh
将.ssh
目录的权限修改为700
,确保只有用户本人可以访问。chmod 600 ~/.ssh/authorized_keys
将authorized_keys
文件的权限修改为600
,确保只有用户本人可以读写。
测试登录
完成了上述步骤后,我们可以使用Python进行免密登录测试。
以下是测试登录的代码示例:
import paramiko
# 创建SSH客户端
ssh = paramiko.SSHClient()
# 自动添加主机密钥
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 密钥登录
ssh.connect('host', username='username', key_filename='private.key')
# 执行命令
stdin, stdout, stderr = ssh.exec_command('ls')
# 打印输出结果
print(stdout.read().decode())
# 关闭连接
ssh.close()
代码说明:
paramiko.SSHClient()
用于创建SSH客户端。ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
设置自动添加目标服务器的主机密钥,避免手动