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_keysauthorized_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())设置自动添加目标服务器的主机密钥,避免手动