我无法与我的一台远程服务器建立 ssh 连接。
我有两者的地址、用户名和密码。
如下创建 ssh 连接,ssh user@server
这会给我以下错误Host key verification failed.
这个话题最常见的答案是运行ssh-keygen -R hostname
。问题出在我的远程服务器上,我的权限非常有限,它给了我错误ssh-keygen: command is not found
。通常像service
or su
all 这样的命令会给我同样的错误command is not found
。
由于我能够通过 SFTP 与 Filezilla 创建连接,我可以手动修复此问题吗?另外,如果重要的话,我的.ssh
目录是空的,所以没有known_host
或类似的东西。
这是完整的输出ssh -v user@server
OpenSSH_6.6.1, OpenSSL 1.0.1e-fips 11 Feb 2013
debug1: Connecting to XXX port 22.
debug1: Connection established.
debug1: identity file /.ssh/id_rsa type -1
debug1: identity file /.ssh/id_rsa-cert type -1
debug1: identity file /.ssh/id_dsa type -1
debug1: identity file /.ssh/id_dsa-cert type -1
debug1: identity file /.ssh/id_ecdsa type -1
debug1: identity file /.ssh/id_ecdsa-cert type -1
debug1: identity file /.ssh/id_ed25519 type -1
debug1: identity file /.ssh/id_ed25519-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.6.1
debug1: Remote protocol version 2.0, remote software version OpenSSH_6.7p1Debian-5+deb8u4
debug1: match: OpenSSH_6.7p1 Debian-5+deb8u4 pat OpenSSH* compat 0x04000000
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr [email protected] none
debug1: kex: client->server aes128-ctr [email protected] none
debug1: kex: [email protected] need=20 dh_need=20
debug1: kex: [email protected] need=20 dh_need=20
debug1: sending SSH2_MSG_KEX_ECDH_INIT
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: Server host key: RSA XXX
debug1: read_passphrase: can't open /dev/tty: No such file or directory
Host key verification failed.
我使用 Windows PCssh
通过 PuTTy 连接到远程服务器(我们称之为服务器 1)。在服务器 1 上,我几乎没有权限运行除scp
和ssh
以及基本 shell 命令之外的任何内容。在此服务器上,我运行一个网上商店,其备份应在另一台服务器(我们称之为服务器 2)上停止。
我希望可以使用sftp
,但我无法使用它,也无法在服务器 1 上安装它。所以我不得不使用scp
。我尝试了它,curl sftp://xxx.xxx
令我惊讶的是它确实有效,但仍然出现新的错误curl: (51) SSL peer certificcate or SSH remote key was not ok
。
答案1
该Host key verification failed
错误消息意味着您的 SSH 客户端已比较接收到的远程服务器的公钥,发现它与~/.ssh/known_hosts
文件中存储的主机密钥版本不匹配。
该命令ssh-keygen -R hostname
不会对远程主机执行任何操作,也不需要任何特殊权限:它所做的只是删除旧主机hostname
密钥你当地的 known_hosts
文件。然后,下次连接到 时hostname
,您的 SSH 客户端将显示 的当前主机密钥的指纹hostname
,并提示您接受它。就像第一次连接到某个主机时一样。
但如果您没有可用的命令,您可以尝试连接
ssh -o StrictHostKeyChecking=no user@server
StrictHostKeyChecking
该选项的默认值为ask
,它会提示您接受或拒绝以前未知的主机密钥...但由于您的会话显然没有伪 TTY,因此ssh
客户端处于非交互模式并且不会提示。该值no
应自动接受主机密钥:如果可能,ssh
会将主机密钥写入~/.ssh/known_hosts
文件。如果成功,则-o StrictHostKeyChecking=no
仅在首次连接到特定服务器时才需要使用该选项。
答案2
当我尝试从运行自定义构建的 buildroot rootfs 的主机通过 SSH 连接到远程计算机时,我遇到了这个问题。
我观察到的是,回显的错误消息“主机密钥验证失败”对于我遇到的情况具有误导性。它实际上不是关于known_hosts文件,而是关于ssh想要做的回显(如下所示)
此密钥未被任何其他名称识别 您确定要继续连接吗(是/否/[指纹])?
为此,它需要 /dev/tty,但无法找到/写入,因此出现错误
read_passphrase:无法打开/dev/tty:没有这样的文件或目录
所以我们需要修复这个问题,以便我们可以在控制台中键入“yes”,然后 ssh 可以将主机密钥添加到known_hosts。
对我有用的解决方案是删除 /dev/tty 并将当前 tty 软链接到它。
console=`tty`
ln -s $console /dev/tty