AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 132970
Accepted
gareth_bowles
gareth_bowles
Asked: 2010-04-16 20:15:11 +0800 CST2010-04-16 20:15:11 +0800 CST 2010-04-16 20:15:11 +0800 CST

我可以自动将新主机添加到 known_hosts 吗?

  • 772

这是我的情况:我正在设置一个测试工具,它将从中央客户端启动许多虚拟机实例,然后通过ssh. 虚拟机将具有以前未使用的主机名和 IP 地址,因此它们不会出现在~/.ssh/known_hosts中央客户端的文件中。

我遇到的问题是ssh针对新虚拟实例运行的第一个命令总是会出现交互式提示:

The authenticity of host '[hostname] ([IP address])' can't be established.
RSA key fingerprint is [key fingerprint].
Are you sure you want to continue connecting (yes/no)?

有没有一种方法可以绕过这个并让客户端机器已经知道新主机,也许是通过使用已经烘焙到虚拟机映像中的公钥?如果可以的话,我真的很想避免使用 Expect 或其他任何东西来回答交互式提示。

linux ssh known-hosts
  • 24 24 个回答
  • 490112 Views

24 个回答

  • Voted
  1. yar
    2011-09-28T12:51:21+08:002011-09-28T12:51:21+08:00

    IMO,最好的方法是:

    ssh-keygen -R [hostname]
    ssh-keygen -R [ip_address]
    ssh-keygen -R [hostname],[ip_address]
    ssh-keyscan -H [hostname],[ip_address] >> ~/.ssh/known_hosts
    ssh-keyscan -H [ip_address] >> ~/.ssh/known_hosts
    ssh-keyscan -H [hostname] >> ~/.ssh/known_hosts
    

    这将确保没有重复的条目,主机名和 IP 地址都覆盖了您,并且还将散列输出,这是一种额外的安全措施。

    • 275
  2. Best Answer
    Ignacio Vazquez-Abrams
    2010-04-16T20:34:11+08:002010-04-16T20:34:11+08:00

    在配置文件中或通过以下方式将StrictHostKeyChecking选项设置为:no-o

    ssh -o StrictHostKeyChecking=no [email protected]

    • 190
  3. fivef
    2014-09-26T02:03:53+08:002014-09-26T02:03:53+08:00

    对于懒惰的人:

    ssh-keyscan -H <host> >> ~/.ssh/known_hosts
    

    -H 散列主机名/IP地址

    • 124
  4. ysawej
    2012-03-07T01:00:20+08:002012-03-07T01:00:20+08:00

    如前所述,使用按键扫描将是正确且不显眼的方式。

    ssh-keyscan -t rsa,dsa HOST 2>&1 | sort -u - ~/.ssh/known_hosts > ~/.ssh/tmp_hosts
    mv ~/.ssh/tmp_hosts ~/.ssh/known_hosts
    

    仅当尚未添加主机时,以上内容才能添加主机。它也不是并发安全的;您不能同时在同一台源计算机上多次执行该代码段,因为 tmp_hosts 文件可能会被破坏,最终导致 known_hosts 文件变得臃肿......

    • 42
  5. Alex
    2010-04-16T21:09:40+08:002010-04-16T21:09:40+08:00

    您可以使用ssh-keyscan命令来获取公钥并将其附加到您的known_hosts文件中。

    • 19
  6. Zart
    2016-02-03T19:12:46+08:002016-02-03T19:12:46+08:00

    这是您可以将ssh-keyscan合并到您的游戏中的方法:

    ---
    # ansible playbook that adds ssh fingerprints to known_hosts
    - hosts: all
      connection: local
      gather_facts: no
      tasks:
      - command: /usr/bin/ssh-keyscan -T 10 {{ ansible_host }}
        register: keyscan
      - lineinfile: name=~/.ssh/known_hosts create=yes line={{ item }}
        with_items: '{{ keyscan.results | map(attribute='stdout_lines') | list }}'
    
    • 11
  7. Chris
    2016-11-24T05:51:31+08:002016-11-24T05:51:31+08:00

    这将是一个完整的解决方案,仅第一次接受主机密钥

    #!/usr/bin/env ansible-playbook
    ---
    - name: accept ssh fingerprint automatically for the first time
      hosts: all
      connection: local
      gather_facts: False
    
      tasks:
        - name: "check if known_hosts contains server's fingerprint"
          command: ssh-keygen -F {{ inventory_hostname }}
          register: keygen
          failed_when: keygen.stderr != ''
          changed_when: False
    
        - name: fetch remote ssh key
          command: ssh-keyscan -T5 {{ inventory_hostname }}
          register: keyscan
          failed_when: keyscan.rc != 0 or keyscan.stdout == ''
          changed_when: False
          when: keygen.rc == 1
    
        - name: add ssh-key to local known_hosts
          lineinfile:
            name: ~/.ssh/known_hosts
            create: yes
            line: "{{ item }}"
          when: keygen.rc == 1
          with_items: '{{ keyscan.stdout_lines|default([]) }}'
    
    • 8
  8. cjs
    2016-12-12T18:27:10+08:002016-12-12T18:27:10+08:00

    要正确执行此操作,您真正想要做的是在创建 VM 时收集它们的主机公钥并将它们放入known_hosts格式文件中。然后,您可以使用-o GlobalKnownHostsFile=..., 指向该文件,以确保您正在连接到您认为应该连接到的主机。但是,您如何执行此操作取决于您如何设置虚拟机,但是如果可能的话,从虚拟文件系统中读取它,或者甚至/etc/ssh/ssh_host_rsa_key.pub在配置期间让主机打印内容可能会奏效。

    也就是说,这可能不值得,这取决于您工作的环境类型以及您预期的对手是谁。如上面其他几个答案中所述,执行简单的“首次连接时存储”(通过扫描或仅在第一次“真实”连接期间)可能会容易得多,并且仍然提供一些安全性。但是,如果您这样做,我强烈建议您将用户已知的主机文件 ( -o UserKnownHostsFile=...) 更改为特定于该特定测试安装的文件;这将避免使用测试信息污染您的个人已知主机文件,并在您删除 VM 时轻松清理现在无用的公钥。

    • 8
  9. Felipe Alcacibar
    2017-04-19T13:01:35+08:002017-04-19T13:01:35+08:00

    我做了一个单行脚本,有点长但对于为具有多个 IP 的主机执行此任务很有用,使用dig和bash

    (host=github.com; ssh-keyscan -H $host; for ip in $(dig @8.8.8.8 github.com +short); do ssh-keyscan -H $host,$ip; ssh-keyscan -H $ip; done) 2> /dev/null >> .ssh/known_hosts
    
    • 7
  10. Amadu Bah
    2017-07-03T03:41:47+08:002017-07-03T03:41:47+08:00

    以下避免了 ~/.ssh/known_hosts 中的重复条目:

    if ! grep "$(ssh-keyscan github.com 2>/dev/null)" ~/.ssh/known_hosts > /dev/null; then
        ssh-keyscan github.com >> ~/.ssh/known_hosts
    fi
    
    • 6

相关问题

  • 多操作系统环境的首选电子邮件客户端

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve