Python SFTP密钥实现流程

以下是实现Python SFTP秘钥的流程图:

flowchart TD;
    A(生成秘钥对)-->B(传输公钥至服务器);
    B-->C(服务器添加公钥至授权文件);
    C-->D(使用秘钥登录服务器);

生成秘钥对

首先,我们需要生成一对密钥,包括公钥和私钥。公钥用于传输给服务器,并在服务器端进行配置,私钥用于在客户端进行认证。

在命令行中执行以下命令来生成密钥对:

ssh-keygen -t rsa -b 4096 -f mykey

其中:

  • -t rsa 指定密钥算法为RSA;
  • -b 4096 指定密钥长度为4096位;
  • -f mykey 指定生成的密钥文件名为mykey。

传输公钥至服务器

接下来,我们需要将生成的公钥传输至服务器端,以便添加到授权文件中。

可以使用paramiko库进行SFTP传输操作。在Python脚本中导入paramiko库:

import paramiko

然后,创建一个Transport对象,并建立与服务器的连接:

transport = paramiko.Transport(('server_ip', 22))
transport.connect(username='username', password='password')

其中:

  • 'server_ip' 是服务器的IP地址;
  • 22 是SSH的默认端口号;
  • 'username' 是登录服务器的用户名;
  • 'password' 是登录服务器的密码。

接下来,创建一个SFTP对象,并建立与服务器的连接:

sftp = transport.open_sftp()

使用put方法将本地的公钥文件传输至服务器:

sftp.put('mykey.pub', '/home/username/.ssh/authorized_keys')

其中:

  • 'mykey.pub' 是本地公钥文件的路径;
  • '/home/username/.ssh/authorized_keys' 是服务器上授权文件的路径。

服务器添加公钥至授权文件

在服务器上打开授权文件(一般位于/home/username/.ssh/authorized_keys),将传输的公钥追加到文件末尾。

通过以下命令将公钥添加到授权文件中:

cat mykey.pub >> ~/.ssh/authorized_keys

使用秘钥登录服务器

配置完服务器后,我们可以使用私钥进行SFTP登录。

在Python脚本中,使用paramiko库导入RSAKey类:

from paramiko.rsakey import RSAKey

然后,创建一个Transport对象,并建立与服务器的连接:

transport = paramiko.Transport(('server_ip', 22))

接下来,使用私钥进行认证:

private_key = RSAKey(filename='mykey')
transport.connect(username='username', pkey=private_key)

其中:

  • 'mykey' 是私钥文件的路径。

最后,我们可以使用SFTP对象进行文件传输等操作:

sftp = transport.open_sftp()
sftp.get('/home/username/file.txt', 'local.txt')

其中:

  • '/home/username/file.txt' 是服务器上文件的路径;
  • 'local.txt' 是本地文件的路径,可以自定义。

总结

通过以上步骤,我们可以实现使用Python生成SFTP秘钥,并通过秘钥进行服务器认证和文件传输。整个过程的代码如下所示:

import paramiko
from paramiko.rsakey import RSAKey

# 生成密钥对
ssh_key = paramiko.RSAKey.generate(4096)
private_key_path = 'mykey'
public_key_path = 'mykey.pub'
ssh_key.write_private_key_file(private_key_path)
ssh_key.write_private_key(public_key_path)

# 传输公钥至服务器
transport = paramiko.Transport(('server_ip', 22))
transport.connect(username='username', password='password')
sftp = transport.open_sftp()
sftp.put(public_key_path, '/home/username/.ssh/authorized_keys')

# 服务器添加公钥至授权文件
sftp.close()
transport.close()

# 使用秘钥登录服务器
transport = paramiko.Transport(('server_ip', 22))
private_key = RSAKey(filename=private_key_path)
transport.connect(username='username', pkey=private_key)
sftp = transport.open_sftp