paramiko使用秘钥连接

本文详细介绍了如何在Windows环境下使用Python的Paramiko库实现SSH连接,包括生成RSA格式密钥对的过程及注意事项,特别指出在Windows下生成密钥与Linux的不同之处,以及如何避免paramiko.ssh_exception.SSHException错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码如下

def ssh_scp(ip, port, user):
    private_key = paramiko.RSAKey.from_private_key_file('/usr/id_rsa')
    # 创建一个SSH客户端对象
    ssh = paramiko.SSHClient()
    # 设置访问策略
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    # 创建连接
    ssh.connect(ip, port, user, pkey=private_key)
    sftp = ssh.open_sftp()
    return sftp

代码:paramiko.RSAKey.from_private_key_file('/usr/id_rsa') 是选择你的秘钥,该方法的第二个参数为秘钥的密码,同时你要将你的公钥添加给你的ssh用户

注意:如果你生成秘钥有设置密码的话需要指定你的密码,源码如下图

这里主要记录下关于在windows下创建秘钥,我是在git上面生成,生成的命令和linux下有一点点不一样,需要指定 -m 参数,不然生成的秘钥不能使用,会出现:paramiko.ssh_exception.SSHException: not a valid RSA private key file 错误

 

windows生成秘钥

该问题解决参考:https://www.cnblogs.com/dbf-/p/11114264.html

通过 ssh-keygen -m PEM -t rsa 命令生成 RSA 格式的密钥对,如下图所示,生成的秘钥是 RSA 格式的,参数指定密钥的格式,PEM(也就是 RSA 格式)是之前使用的旧格式

PS:如果像linux中,默认使用 ssh-keygen -t rsa 的方式生成秘钥,秘钥格式如下,但是paramiko使用该格式的秘钥连接windows服务器会出错

 

 

### 通过SSH密钥登录远程服务器的完整步骤 #### 1. 创建SSH密钥对 在本地Mac上生成SSH密钥对,可以通过以下命令完成: ```bash ssh-keygen -t rsa -b 4096 -C "your_email@example.com" ``` 生成的私钥(`id_rsa`)和公钥(`id_rsa.pub`)默认存储在`~/.ssh/`目录下[^1]。 #### 2. 将公钥添加到远程服务器 将生成的公钥内容复制到远程服务器的`~/.ssh/authorized_keys`文件中。可以使用以下命令直接传输公钥: ```bash ssh-copy-id username@remote_host ``` 如果`ssh-copy-id`不可用,也可以手动复制公钥内容并粘贴到远程服务器的`~/.ssh/authorized_keys`文件中。 #### 3. 配置远程服务器的SSH服务 编辑远程服务器的SSH配置文件`/etc/ssh/sshd_config`,确保以下设置已启用: ```bash PermitRootLogin yes RSAAuthentication yes PubkeyAuthentication yes PasswordAuthentication no ``` 保存后重启SSH服务以使更改生效: ```bash systemctl restart sshd ``` 这一步确保了服务器允许基于密钥的身份验证,并禁用了密码登录[^2]。 #### 4. 设置正确的权限 确保远程服务器上的`.ssh`目录及其文件具有正确的权限,否则SSH程序可能无法识别公钥文件。执行以下命令设置权限: ```bash chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys ``` 这是为了防止其他用户读取或修改这些敏感文件[^5]。 #### 5. 使用VSCode连接远程服务器 如果希望通过VSCode进行连接,需要安装`Remote - SSH`插件,并按照以下步骤操作: 1. 打开命令面板(`Ctrl+Shift+P`或`Cmd+Shift+P`),选择“Remote-SSH: Add New SSH Host”。 2. 输入目标服务器连接信息(如`ssh username@remote_host`)。 3. 确认配置文件路径后,点击蓝色小框打开远程端口。 4. 在弹出窗口中选择连接到主机,并输入远程服务器密码。 5. 新建终端并生成密钥对,完成后即可无需频繁输入密码进行操作[^3]。 #### 6. 使用Eclipse连接远程服务器 对于Eclipse用户,可以通过RSE(Remote System Explorer)插件实现SSH密钥登录。具体步骤参考相关博客[^4]。 ```python # 示例代码:验证SSH连接是否成功 import paramiko client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect('remote_host', username='username', key_filename='/path/to/private/key') stdin, stdout, stderr = client.exec_command('ls -l') print(stdout.read().decode()) client.close() ``` ### 注意事项 - 确保本地和远程服务器的时间同步,避免因时间差异导致认证失败。 - 如果遇到连接问题,检查SSH日志文件(如`/var/log/auth.log`)以排查错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值