curl
我正在尝试使用另一台 Centos 6 服务器作为客户端并使用协议从 Centos 6 服务器下载文件scp
,我收到以下错误输出:
$ curl -v -O scp://cz/path/to/file
* About to connect() to cz port 22 (#0)
* Trying 1.2.3.4... connected
* Connected to cz (1.2.3.4) port 22 (#0)
* Failed to read known hosts from /home/cpn/.ssh/known_hosts
* SSH host check: 0, key: AAAAB3NzaC1yc2EAAAABIwAAAQEAyeeDgYFsHi3Ks3PxCXt69IHBr7yNII720sXOm9WKIdGnwPf7QHbLsMf41mctcGRSJ2yO2EXpNEbZQhdUqs3oImdTn2OHF/K8STK1GXMVseusgmPuQWBt36AVPon7h9lSCjtxt+1UpFJoireXvhUDlgg9i1C9QbE04GAmA7vMOmtcVt3/3F6X/hKhOZvHj1gu5+RzCO8fXo2R8XeRoN0GcU2jVOhug0G+hXAiHymh5JzVm4YlCzsNIv3mDOF2lZRLdkor5FDKjBY8/o/5O8U0lWm4ie2S7qDppqCJP2SnNTWlaM3k5HDmdyEKKZ0lV+qG33q3ADZxjBeIKQtWLZfC3w==
* SSH authentication methods available: publickey,gssapi-keyex,gssapi-with-mic,password
* Using ssh public key file /home/cpn/.ssh/id_dsa.pub
* Using ssh private key file /home/cpn/.ssh/id_dsa
* SSH public key authentication failed: Username/PublicKey combination invalid
* Authentication failure
* Closing connection #0
scp
我可以不问问题地下载该文件:
$ scp cz:/path/to/file .
我可以再次登录服务器,ssh
无需询问任何问题
$ ssh cz
服务器的文件中同时存在ssh-rsa
和密钥ssh-dss
authorized_keys
到底curl
在抱怨什么?我唯一的猜测是curl
需要dsa
客户known_hosts
文件中的密钥。如果是这样的话如何生成呢?或者如何在该文件中curl
查找密钥?rsa
更新
在客户端:
$ ls -l /home/cpn/.ssh/known_hosts
-rw-r--r--. 1 cpn cpn 1970 Nov 12 16:12 /home/cpn/.ssh/known_hosts
答案1
我至少可以解释可能发生的情况:.
输出中的权限后面ls -l
表示存在 SELinux 策略,该策略根据访问文件的程序覆盖文件权限。用于ls -Z ~/.ssh/known_hosts
显示文件的策略。
据推测,/usr/bin/ssh
及其配套程序(ssh-keygen
、scp
等)是唯一允许访问该文件的程序。我对此政策持怀疑态度:~/.ssh/known_hosts
有时手动编辑很有用。但是我不明白为什么curl想要读取该文件而不是让ssh
朋友们这样做。
您可以使用chcon
命令编辑该文件的策略,以及restorecon
恢复默认策略。请参阅CentOS 维基有关 SELinux 的更多信息。
答案2
对于通过谷歌找到此页面的人:
看起来旧版本的 cURL 会因known_hosts
无法识别的密钥类型的文件而阻塞,并且足够旧的 cURL 版本无法识别任何密钥类型,但ssh-rsa
.
例如,我的 cURL 是版本 7.29.0(已有 6 年历史,是撰写本文时 CentOS 7 中可用的最新版本),并且将在第一个之后停止读取密钥,这是我文件ecdsa-sha2-nistp256
中的大部分密钥。known_hosts
答案3
谢谢 - 清除我的known_hosts 文件使该错误消失。这不是一个长期的解决方案,但可以作为一次性解决方法。