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