Git 吉特说:“这是一个很好的例子。”;警告:永久添加到已知主机列表中“;

Git 吉特说:“这是一个很好的例子。”;警告:永久添加到已知主机列表中“;,git,shell,command-line,ssh,terminal,Git,Shell,Command Line,Ssh,Terminal,每次我使用git与远程设备进行交互时,例如拉动或推动时,都会显示以下消息: 警告:已将“…”(RSA)永久添加到已知主机列表中 如何防止显示此恼人的消息?这只是一个让人烦恼的问题,因为一切都正常运行。这条消息来自SSH,它警告您正在连接到一个以前从未连接过的主机。我不建议您将其关闭,因为这意味着您可能会错过主机密钥更改的警告,这可能表示您的SSH会话受到了MITM攻击。据我所知,您注意到的问题没有干净的解决方案。 先前建议的/dev/null重定向仍将显示警告,它只是通过将输出重定向到/dev/

每次我使用git与远程设备进行交互时,例如拉动或推动时,都会显示以下消息:

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


如何防止显示此恼人的消息?这只是一个让人烦恼的问题,因为一切都正常运行。

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

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

据我所知,唯一的选择是捕获消息并将其从stdout中删除

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配置将影响所有ssh会话,而不仅仅是那些想要抑制消息的会话

缺点:
它有点开销,不是一个完全干净的解决方案,并且将stderr移动到stdout中,这在所有情况下可能都不好。

但它将消除您不希望看到的任何类型的警告消息,并且您可以使用单个脚本包装所有您想要的二进制文件(通过使用指向它的文件系统链接)

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

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

-o LogLevel=quiet
例如,下面打印了machine.example.org上安装的gcc版本(没有警告):


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

Host *
LogLevel error

这将禁用警告,但不会禁用错误消息。与
~/.ssh/config
中的其他设置一样,如果需要更细粒度的控制,您可以基于每个主机配置
日志级别

解决方案:创建一个
~/.ssh/config
文件并插入以下行:

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

这个问题困扰了我很长一段时间。出现此问题的原因是为Windows编译的OpenSSH客户端没有检查
~/.ssh/known\u hosts

ssh-vvvvvvvvgit@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.

如果您使用GITHUB的存储库,请考虑使用<强> http版本的URL,以完全回避这个问题:


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

这主要意味着该主机的密钥发生了更改
~/.ssh/known\u hosts
,并且不会自动更新它。因此,每次您收到此警告消息时

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

解决方案

如果您只有一个条目,那么您可以删除
~/.ssh/known\u hosts
文件,并且在第一次连接之后,密钥将在那里,之后不会出现警告消息

如果有多个条目,则可以使用下面的命令删除

$ ssh-keygen -R <hostname>
$ssh keygen-R

它对我来说很好

~/.ssh/config
文件中将
日志级别设置为
错误
(非
安静
),以避免看到这些错误:

Host *
   StrictHostKeyChecking no
   UserKnownHostsFile /dev/null
   LogLevel ERROR

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

当我开始使用Windows机器时,我也遇到了同样的问题。在我的情况下,这是因为我的SSH设置没有完成。Github提供了关于SSH设置的非常精确的文档。一旦处理好了,问题就解决了

添加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

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

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

在我的情况下,这是因为设置服务器的管理员在
~/.ssh/config

StrictHostKeyChecking no
UserKnownHostsFile /dev/null
在大多数情况下,由于不使用
~/.ssh/known_hosts
文件,该方法工作正常。但对于企业gitlab repo,每次它都会发出“警告:永久性地将…添加到已知主机列表中。”

我的解决方案是注释掉
UserKnownHostsFile/dev/nullUserKnownHostsFile ~/.ssh/known_hosts
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
ssh-add ~/.ssh/id_rsa
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
ECDSA host key for IP address '10.1.2.3' not in list of known hosts.