Git 说“警告:永久添加到已知主机列表”

Posted

技术标签:

【中文标题】Git 说“警告:永久添加到已知主机列表”【英文标题】:Git says "Warning: Permanently added to the list of known hosts" 【发布时间】:2012-03-07 03:57:08 【问题描述】:

每次我使用 git 与遥控器交互时,例如拉或推时,都会显示以下消息:

警告:将“...” (RSA) 永久添加到已知主机列表中。

如何防止显示此烦人的消息?这只是一个烦恼——一切正常。

【问题讨论】:

您真的是指每次吗?它是给您The authenticity of host '...' can't be established. RSA key fingerprint is .... Are you sure you want to continue connecting (yes/no)? 形式的提示,还是您压制了它?如果是,是不是每次都是同一个指纹?如果不是,那真的很可怕。不那么可怕的选择是它实际上并没有设法写入主机文件,所以它每次都会重试。看看~/.ssh/known_hosts 是的。 每一次。但是,我没有看到“您确定...”消息 - 也许我已经将其隐藏了。 主机是否列在~/.ssh/known_hosts 中? (是否列出了 5000 次?)~/.ssh/config 是否存在/包含任何内容(尤其是 StrictHostKeyChecking 的值)? 主机在该文件中列出一次,它是唯一的条目。 我猜你的 known_hosts 文件的内容是错误的。它应该是主机密钥,在一条非常长的线上。如果您只有主机名(例如),它将无法正常工作。我建议您删除此文件(如果它确实只包含该单个主机的信息)并允许 SSH 在您下次连接时创建它。之后应该保持沉默。 【参考方案1】:

我在 Linux/Cent OS VM 中遇到了同样的错误,这是因为重启后 IP 发生了变化。为了解决这个问题,我在网络中定义了一个静态 IP 并将该条目添加到 /etc/hosts 文件中。对于静态 IP,请提及稍高的范围值。例如,如果您当前的 IP (ipconfig/ifconfig) 是 192.168.0.102,那么下次重启后可能会变成 192.168.0.103。因此,将 IPV4 设置中的静态 IP 定义为 192.168.0.181 应该可以解决问题。

【讨论】:

尝试突出显示关键字并明确格式,这将有助于为其他人找到答案【参考方案2】:

据我所知,您提到的问题没有干净的解决方案。 之前建议的 /dev/null 重定向仍然会显示警告,它只是通过将输出重定向到 /dev/null 来禁用存储远程密钥的安全功能。 所以 ssh 仍然会认为它写了一些实际上被丢弃的东西。

据我所知,唯一的选择是捕获消息并将其从标准输出中删除。

ssh/scp..... 2>&1 | grep -v "^Warning: Permanently added"

这是一个完整的示例,您可以将其用作包装器来隐藏此类警告:

#!/bin/bash
remove="^Warning: Permanently added" # message to remove from output

cmd=$0##*/

case $cmd in
 ssh)
  binary=/usr/bin/ssh
 ;;
 *)
  echo "unsupported binary ($0)"
  exit
 ;;
esac
$binary "$@" 2>&1 | grep -v "$remove"

要安装它,您需要做的就是为您要修改的实际命令添加/修改“case”语句。 (ssh、scp、git 等)。 “ssh)”表示脚本必须命名为“ssh”(或者脚本的链接命名为 ssh)。 binary=/full/path 是脚本应该包装的二进制文件的路径。 然后将具有您选择的名称的脚本放入 /bin 或其他位置。

脚本也是您可以在 $binary 变量中使用 -o "UserKnownHostsFile=/dev/null" 的地方,这比将这样的安全风险放入全局 ssh 中要好得多这将影响您所有的 ssh 会话,而不仅仅是那些您想要抑制消息的配置。

缺点: 这有点开销,不是一个完全干净的解决方案,并且将 stderr 移动到 stdout 中,这在所有情况下都可能不是很好。 但它会消除您不希望看到的任何类型的警告消息,并且您可以使用单个脚本来包装您想要的所有二进制文件(通过使用指向它的文件系统链接)

【讨论】:

【参考方案3】:

在我的情况下,我在使用 Gridengine qrsh 远程 shell 登录时只收到了 ssh 警告。而普通的ssh 会按预期工作(第一次发出警告,然后是安静的后续时间)。

我的解决方案是使用 Gridengine 可以选择的所有可能的服务器名称手动填充 ~/.ssh/known_hosts(使用 qhost 列出服务器):

for p in server1 server2 server3 server4; do
  ssh-keyscan -H $p.company.com;
  ssh-keyscan -H $(getent hosts $p | perl -lane 'print $F[0]');
done >> ~/.ssh/known_hosts

背景:

Gridengine 是一个作业调度程序,它可以使用 ssh 来选择负载最少的服务器。警告的原因是qrsh 似乎总是指定一个非标准端口来进行 ssh 连接,导致known_hosts 被更新为一个也包含端口号的条目。下次当qrsh 选择同一台服务器时,将有一个新的端口号,known_hosts 将使用新的端口特定条目进行更新。还要添加原始主机 IP 地址的原因是某些主机使用了ecdsa-sha2-nistp521。如果未添加原始 IP 条目,我会收到警告:

ECDSA host key for IP address '10.1.2.3' not in list of known hosts.

【讨论】:

【参考方案4】:

将您的私钥添加到 ssh-agent 中:

ssh-add ~/.ssh/id_rsa

【讨论】:

【参考方案5】:

就我而言,这是因为设置服务器的管理员在~/.ssh/config中设置了这些选项

StrictHostKeyChecking no
UserKnownHostsFile /dev/null

不使用~/.ssh/known_hosts 文件在大多数情况下都可以正常工作。但是对于企业 gitlab repo,每次它都会给出“警告:永久添加...到已知主机列表。”

我的解决方案是注释掉UserKnownHostsFile /dev/null 行,它允许创建~/.ssh/known_hosts。然后它没有再给出任何警告。

您的known_hosts 中可能还有旧的/无效条目。

# find entry in ~/.ssh/known_hosts
ssh-keygen -F <hostname>

# delete entry in ~/.ssh/known_hosts
ssh-keygen -R <hostname>

【讨论】:

【参考方案6】:

添加 ssh 密钥

ssh-keygen -t rsa -b 4096 -C "abc@abc.com"

eval "$(ssh-agent -s)"

ssh-add ~/.ssh/bitbucket_rsa

箱子配置文件

crate ~/.ssh/config

添加下一行。

UserKnownHostsFile ~/.ssh/known_hosts

然后添加发布密钥并克隆您的存储库...完成.....

【讨论】:

【参考方案7】:

解决方法:创建~/.ssh/config文件并插入行:

UserKnownHostsFile ~/.ssh/known_hosts

下次访问 Github 时您会看到该消息,但之后您将不再看到该消息,因为主机已添加到 known_hosts 文件中。这解决了问题,而不仅仅是隐藏日志消息。

这个问题困扰了我很长一段时间。出现问题是因为为Windows编译的OpenSSH客户端没有检查~/.ssh/known_hosts中的known_hosts文件

ssh -vvvvvvvvvvvvvvvvvvv git@github.com

debug3: check_host_in_hostfile: filename /dev/null
debug3: check_host_in_hostfile: filename /etc/ssh/ssh_known_hosts
debug3: check_host_in_hostfile: filename /dev/null
debug3: check_host_in_hostfile: filename /etc/ssh/ssh_known_hosts
Warning: Permanently added 'github.com,207.97.227.239' (RSA) to the list of known hosts.

【讨论】:

是的,我不认为抑制警告或错误是解决问题的正确方法。 ;) 效果很好!终于,愚蠢的警告停止了。顺便说一句,在 Windows 上,~/.ssh/config 中的 ~ 是用户的主文件夹。要轻松打开它,请按 Win-R,输入 cmd Enter。命令提示符应该已经在您的主文件夹中打开。键入 cd .ssh Enter,然后键入 start . Enter 以在 Windows 资源管理器中打开该文件夹。然后您可以在记事本中创建 config 文件(保存时没有 .txt 扩展名)。 (专业用户可以在命令提示符本身;) 中直接回显到一个新文件)。 运行涉及 remote 的 git 命令两次(如git fetch),然后你'重新完成。 为什么 ssh 有 20 个 v? @bubakazouba v 越多,日志越详细,请查看文档。三个就够了,二十个就过分了:D 是的,按住 v 一秒钟比检查文档以确定有用 v 的最大数量要快【参考方案8】:

当我开始使用 Windows 机器时,我遇到了同样的问题。就我而言,这是因为我的 SSH 设置没有完成。 Github 有关于 SSH 设置的非常精确的文档。处理好之后,问题就解决了。

https://help.github.com/articles/checking-for-existing-ssh-keys/ https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/

【讨论】:

【参考方案9】:

我有同样的问题,我发现我的~ 中没有.ssh 文件。所以我只是在~路径下创建.ssh目录,问题就解决了。

【讨论】:

【参考方案10】:

~/.ssh/config 文件中将LogLevel 设置为ERROR(而不是QUIET)以避免看到这些错误:

Host *
   StrictHostKeyChecking no
   UserKnownHostsFile /dev/null
   LogLevel ERROR

【讨论】:

这在我的情况下效果最好 - 或者您可以在命令行上指定“-oLogLevel=ERROR” 我仅将这些设置用于本地 ips 和主机,这些主机大多是主机密钥相对经常更改的虚拟机:Host 192.* 10.* *.mylocal.domain 超级聪明 =)) 这个工作完美而简单:LogLevel ERROR【参考方案11】:

主要表示该主机~/.ssh/known_hosts的key发生了变化,不会自动更新。因此,每次您收到此警告消息时。

在连接到重新创建的虚拟机时经常发生这种情况,这会更改具有相同 IP 地址的密钥

解决方案

如果你只有一个条目,那么你可以删除~/.ssh/known_hosts文件,第一次连接后,密钥会在那里,之后就没有警告信息了。

如果你有多个条目,那么你可以使用下面的命令来删除

$ ssh-keygen -R <hostname>

对我来说很好用

【讨论】:

【参考方案12】:

如果您使用来自 GitHub 的存储库,请考虑使用 URL 的 HTTPS 版本,以完全回避此问题:

如果您从 Windows GitHub 应用程序中克隆您的存储库,这就是它用于远程 URL 的内容。也许他们知道我们不知道的事情。

【讨论】:

注意:如果使用私钥认证,则不能使用HTTP(S)。【参考方案13】:

要禁止ssh 的警告消息,您可以将以下行添加到~/.ssh/config

Host *
LogLevel error

这将禁用警告但不会禁用错误消息。与~/.ssh/config 中的其他设置一样,如果您想要更精细的控制,您可以在每个主机的基础上配置LogLevel

【讨论】:

【参考方案14】:

将以下行添加到您的 ssh 配置文件 ($HOME/.ssh/config):

LogLevel=quiet

如果从命令行运行 ssh,请在命令字符串中添加以下选项:

-o LogLevel=quiet

例如,以下打印出安装在 machine.example.org 上的 gcc 版本(并且没有警告):

ssh -o UserKnownHostsFile=/dev/null \
    -o StrictHostKeyChecking=no \
    -o LogLevel=quiet \
    -i identity_file \
    machine.example.org \
    gcc -dumpversion

【讨论】:

将“LogLevel=quiet”添加到“config”文件有效。谢谢。 为了维护安全,最好将“LogLevel=quiet”放在“Host”部分中。 LogLevel=quiet 是个坏主意,他希望显示所有错误,他只是想避免这个特定的令人讨厌的错误。可能是因为他骗ssh使用/dev/null作为known_hosts文件,可能是因为他想关闭known_hosts指纹检查,但是不能,因为ssh霸主不允许。 @bukzor loglevel=error 在连接终止时仍然显示“与 的连接已关闭”,这对脚本编写来说也很烦人。 我对此投了反对票,因为它并没有真正解决问题。它只是隐藏它。【参考方案15】:

该消息来自 SSH,它警告您正在连接到以前从未连接过的主机。我不建议将其关闭,因为这意味着您可能会错过有关主机密钥更改的警告,这可能表明您的 SSH 会话受到 MITM 攻击。

【讨论】:

但我每天连接它 10-15 次,仍然收到此警告。 @JackB。查看~/.ssh/known_hosts,看看你的主机是否在里面。 密钥是否因某种原因而改变?检查文件中的指纹与 ssh 输出的指纹。另外,你的 .ssh 目录的模式是否设置为 0700? @JasonCarreiro,我是个大男孩,我知道没有人会在我的机架内进行 MITM 攻击,安全是一种权衡,我希望新计算机可以使用预共享密钥开箱即用,无需管理 CA 或 ssh-keyscan

以上是关于Git 说“警告:永久添加到已知主机列表”的主要内容,如果未能解决你的问题,请参考以下文章

git起步

git --- 撤销修改

6 个方便的 Git 脚本 | Linux 中国

Git基本概念

Python操作Git库 `GitPython`

GIT-GIT分支列表