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
在连接终止时仍然显示“与 该消息来自 SSH,它警告您正在连接到以前从未连接过的主机。我不建议将其关闭,因为这意味着您可能会错过有关主机密钥更改的警告,这可能表明您的 SSH 会话受到 MITM 攻击。
【讨论】:
但我每天连接它 10-15 次,仍然收到此警告。 @JackB。查看~/.ssh/known_hosts
,看看你的主机是否在里面。
密钥是否因某种原因而改变?检查文件中的指纹与 ssh 输出的指纹。另外,你的 .ssh 目录的模式是否设置为 0700?
@JasonCarreiro,我是个大男孩,我知道没有人会在我的机架内进行 MITM 攻击,安全是一种权衡,我希望新计算机可以使用预共享密钥开箱即用,无需管理 CA 或 ssh-keyscan
。以上是关于Git 说“警告:永久添加到已知主机列表”的主要内容,如果未能解决你的问题,请参考以下文章