当来自 cmd 的 scp 工作时,使用 libssh2 scp 检索文件无法进行身份验证
Using libssh2 scp to retrieve a file fails to authenticate when scp from cmd works
我正在尝试使用 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(session, username, username_len, pubkeydata, pubkeydata_len, sign_callback, 抽象), 它收到一个 LIBSSH2_ERROR_SOCKET_RECV.
然而,其背后的代码对于我未经训练的眼睛来说太神秘了。
我错过的一件明显的事情是错误消息,结果是 "Waiting for USERAUTH response"
潜在相关:
https://github.com/nodegit/nodegit/issues/553
遵循我从上面 link 收集到的一些小建议并从 authorized_keys 中删除一些键后,错误仍然存在,但消息更改为 "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 时,它 运行 可以使用带密码的密钥。
不过,现在 "works"。
我正在尝试使用 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(session, username, username_len, pubkeydata, pubkeydata_len, sign_callback, 抽象), 它收到一个 LIBSSH2_ERROR_SOCKET_RECV.
然而,其背后的代码对于我未经训练的眼睛来说太神秘了。
我错过的一件明显的事情是错误消息,结果是 "Waiting for USERAUTH response"
潜在相关:
https://github.com/nodegit/nodegit/issues/553
遵循我从上面 link 收集到的一些小建议并从 authorized_keys 中删除一些键后,错误仍然存在,但消息更改为 "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 时,它 运行 可以使用带密码的密钥。
不过,现在 "works"。