我正在尝试在低级别使用SSH协议(即我不想启动shell或任何东西,我只想传递数据)。因此,我直接使用Paramiko的Transport
课程。
我已经完成了服务器方面的工作,但现在我正在用愚蠢的东西撞墙。为了让客户端连接到服务器,Transport
的{{3}}将两个connect
method对象作为参数:客户端的私钥(pkey
),以及服务器的公钥(hostkey
)。
PKey
类被描述为“公钥的基类”。然而问题是我无法弄清楚如何用ssh公钥(即字符串ssh-whatever AAblablabla
)创建这样的PKey
对象。它有从私钥构建这样一个对象的方法,但显然我不希望客户端知道服务器的私钥。
我觉得我忽略了一些简单的事情,但我无法在网上找到这方面的信息;大多数教程都使用更高级PKey
加载系统的known_hosts
键。
答案 0 :(得分:4)
必须在另一个不仅仅用于密钥比较的环境中再次解决这个问题(它用于签名检查)。这是正确的方法。回想起来,这很简单,但几乎没有记录。
# For a public key "ssh-rsa AAblablabla...":
key = paramiko.RSAKey(data=base64.b64decode('AAblablabla...'))
key.verify_ssh_sig(..., ...)
答案 1 :(得分:1)
通过调用connect
method documentation:
clientPrivateKey = paramiko.RSAKey.from_private_key_file(...)
transport = paramiko.Transport(...)
knownServerKey = 'ssh-rsa AAblablabla'.split(' ', 3)
transport.start_client()
serverKey = transport.get_remote_server_key()
if serverKey.get_name() == knownServerKey[0] and serverKey.get_base64() == knownServerKey[1]:
# Valid key
transport.auth_publickey('username', clientPrivateKey)
channel = transport.open_channel('...')
else:
# Invalid key
这或多或少what the connect
method does anyway。
我仍然愿意接受更好/更短的建议。就目前而言,hostkey
方法的connect
参数似乎无法使用。
答案 2 :(得分:0)
要添加到为传输客户端提供的解决方案中。这是我为SSH客户端添加字符串公共密钥的解决方案:
my_pub_key = "xx.xx.xx.xx ecdsa-sha2-nistp256 mlzdHAyNT....."
my_host = my_pub_key.split(' ')[0]
password = 'myFavortitePassword'
username = 'myUsername'
ssh_client=paramiko.SSHClient()
host_key_policy = paramiko.MissingHostKeyPolicy()
host_key_policy.missing_host_key(ssh_client, my_host, my_pub_key)
ssh_client.connect(hostname= my_host
,username=username
,password=password
,port=22
,look_for_keys=False)