使用 Paramiko 和 RSA 密钥文件的嵌套 SSH

Posted

技术标签:

【中文标题】使用 Paramiko 和 RSA 密钥文件的嵌套 SSH【英文标题】:Nested SSH with Paramiko and RSA key file 【发布时间】:2020-12-11 04:54:06 【问题描述】:

我正在尝试使用 Paramiko 嵌套 SSH,我将从本地计算机连接到服务器 X,然后从那里连接到服务器 Y。这里连接到服务器 XI 使用用户名、密码身份验证并连接到服务器 Y使用用户名和 RSA 密钥。问题是 RSA 密钥托管在用于连接服务器 Y 的 System X 中。如果我将密钥文件托管在本地 PC 中并将本地 PC 目录路径提供给 Paramiko SSH 客户端,我就能够成功运行脚本。但我想直接从服务器 X 读取密钥文件。我该怎么做,请帮助我。

服务器 X 密钥文件 = "/home/test/keys/id_rsa"

import time
import paramiko,io
import csv
import sys
import subprocess

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ssh.connect('X',22, username='subhash', password='mit@12345')

vmtransport = ssh.get_transport()
dest_addr = ('Y', 22)
local_addr = ('X', 22)
vmchannel = vmtransport.open_channel("direct-tcpip", dest_addr, local_addr)

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

remote_file = paramiko.RSAKey.from_private_key_file('C:/Users/test/Documents/hindi/id_rsa')
client.connect('Y', username='root',pkey=remote_file,sock=vmchannel)

client_stdin ,client_stdout, client_stderr = client.exec_command("pwd")

【问题讨论】:

【参考方案1】:

如果需要使用存储在跳转服务器上的私钥,则不能使用端口转发来实现跳转。

将密钥下载到本地计算机。如果您不想将密钥物理存储在本地计算机上,则可以仅在 Python 代码中将其下载到内存中。见Loading key from an SSH jumphost using Paramiko。

否则您将不得不通过在跳转服务器上运行ssh 客户端来实现跳转,这将获取存储在那里的私钥(这通常是一个蹩脚的解决方案):

ssh.exec_command("ssh root@Y pwd")

【讨论】:

以上是关于使用 Paramiko 和 RSA 密钥文件的嵌套 SSH的主要内容,如果未能解决你的问题,请参考以下文章

Paramiko 无法识别 ssh-keygen 生成的 SSH 密钥:“不是有效的 RSA 私钥文件”

Paramiko 无法识别 ssh-keygen 生成的 SSH 密钥:“不是有效的 RSA 私钥文件”

Paramiko 无法识别 ssh-keygen 生成的 SSH 密钥:“不是有效的 RSA 私钥文件”

python Paramiko SFTP通过RSA密钥传输文件http://code.activestate.com/recipes/576810-copy-files-over-ssh-using-

在 Paramiko 中使用 ssh_config 文件

Python之路43-paramiko模块