我正在尝试使用libssh2 scp从实例中检索一个文件。
为了确保我的用户名、密码和密钥是正确的,我做到了:
sudo scp -v -P #port -i /home/username/.ssh/id_rsa username@XX.XX.XX.XX:/home/username/file .
向我询问密码,然后成功地检索到文件。
在尝试使用libssh2完成同样的任务时,我遵循了下面的示例:
http://www.libssh2.org/examples/scp.html
对变量类型的表面更改,而这些类型似乎已经发生了变化。
(这并不重要,因为这些变量是在身份验证之后出现的)。
然而,在
libssh2_userauth_publickey_fromfile(session, username,"/home/username/.ssh/id_rsa.pub","/home/username/.ssh/id_rsa",password)
程序总是使用LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED退出。
使用gdb进行检查,我确信所应用的用户名和密码是正确的。
造成这个问题的原因是什么?
编辑:
进一步深入研究GDB可以发现,在libssh2_userauth_publickey_fromfile()深度的某个地方,在_libssh2_userauth_publickey(会话、用户名、username_len、pubkeydata、pubkeydata_len、sign_callback、抽象)中,它接收到了一个LIBSSH2_ERROR_SOCKET_RECV。
然而,这背后的代码对我未经训练的眼睛来说太神秘了,弄不懂。
我忽略了一件明显的事情,那就是错误消息,它是“等待USERAUTH响应”。
潜在相关性:https://github.com/nodegit/nodegit/issues/553
在遵循我可以从上面的链接中收集到的小建议并从authorized_keys中删除几个键之后,错误保持不变,但是消息更改为“回调返回错误”。不确定是改善还是更糟。
通过检查服务器端日志,我发现以下内容:
Oct 20 06:53:51 testbed1 sshd[25837]: error: Could not load host key: /etc/ssh/keyname
Oct 20 06:53:52 testbed1 sshd[25837]: Connection closed by XX.XX.XX.XX [preauth]
Oct 20 06:54:48 testbed1 sshd[25839]: error: Could not load host key: /etc/ssh/keyname
Oct 20 06:54:51 testbed1 sshd[25839]: Accepted publickey for username from...
前两行位于libssh2失败的尝试中。
接下来的两行是scp在命令行上的成功尝试。
发布于 2015-10-21 02:54:09
我还是不确定原因是什么。
我只能推测,我陷入了这里描述的bug:
cURL sftp public key authentication fails "Callback Error"
该代码在没有密码的密钥上运行良好。
我仍然很难说这是正确的解决方案,因为当我刚开始使用libssh2时,它可以很好地使用带有密码的密钥。不过,现在“起作用了”。
https://stackoverflow.com/questions/33231547
复制相似问题