我正在尝试使用libssh2 scp从实例检索文件。
为了确保我的用户名、密码和密钥是正确的,我做了:

sudo scp -v -P #port -i /home/username/.ssh/id_rsa [email protected]:/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)

程序总是以LIPSHS2YError公钥KEY退出。
通过使用gdb进行检查,我确信所应用的用户名和密码是正确的。
是什么原因导致了这个问题?
编辑:
进一步研究GDB发现,在libssh2_userauth_publickey_fromfile()的深度,在libssh2_userauth_publickey(session,username,username_len,pubkeydata,pubkeydata_len,sign_callback,abstract)中,它接收到libssh2_ERROR_SOCKET_RECV。
然而,这背后的密码太神秘了,让我未经训练的眼睛无法理解。
我忽略了一个明显的错误消息,它是“等待USERAUTH响应”
潜在相关:
https://github.com/nodegit/nodegit/issues/553
在遵循了我从上面的链接收集到的一些建议并从授权的密钥中删除了一些密钥之后,错误仍然是相同的,但消息更改为“Callback returned error”。不确定是好转还是恶化。
在检查服务器端日志时,我发现以下内容:
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成功尝试的。

最佳答案

我仍然不能确定是什么原因。
我只能推测我掉进了这里描述的虫子里:
cURL sftp public key authentication fails "Callback Error"
在没有密码短语的密钥上,代码运行良好。
我仍然很难说这是确切的解决方案,因为当我刚开始使用libssh2时,它可以很好地使用带有密码短语的密钥。
尽管如此,它现在还是“管用”了。

关于c - 当来自cmd的scp工作时,使用libssh2 scp检索文件无法通过身份验证,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33231547/

10-10 19:59