Linux 批量添加 known_hosts

news2024/9/21 4:25:49

前言

我们在做完linux ssh 免密登录后,通常会执行一些自动化任务(比如启动Spark集群),也就是需要ssh到每台节点执行相同命令。但是有一个问题就是如果 known_hosts 文件中不存在这个ip的话,在第一次连接时会弹出确认公钥的提示,需要手动输入 yes,才能继续往下进行。输入yes 后会将公钥添加到 .ssh/known_hosts 中,下次连接时就不需要再次确认了。但是如果节点比较多的话,假如有100个节点,那么我们需要手动输入100次 yes 比较麻烦。本文就是记录如何通过配置或者命令来解决这个问题,方便我们后面执行相关的操作。

  • ssh 到其他节点

  • 启动Spark集群

  • 输入yes后连接成功,并添加公钥到 known_hosts,这里的密钥类型为 ECDSA

cat .ssh/known_hosts
[192.168.1.2]:6233 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBAymd866NPMmHBlwT3noxxuWqqLcnfMBf5fqgUtP2uaXmNoEApOa7go5RSSx4xzO8CP1u0fOVyOqEYMYJU5S2GQ=

解决方案一:ssh-keyscan

ssh-keyscan 命令是一个收集大量主机公钥(HostKey)的实用工具。设计目的是帮助建立和验证 known_hosts 文件。使用了非阻塞 socket I/O 函数, 尽可能多的并行访问多个主机, 因此它的效率很高. 它可以在数十秒内采集某域中 1,000 台主机的密钥, 即使某些主机离线或不使用 ssh. 扫描的时候无须登录目标主机, 也不涉及任何加密操作.

引用自:https://developer.aliyun.com/article/1114651

命令

ssh-keyscan -p 6233 -t ECDSA -f hostlist.txt >> .ssh/known_hosts

通过这个命令可以将 hostlist.txt 中所有的ip对应的HostKey添加到known_hosts中,这样我们再执行自动化脚本ssh这些节点时就不弹出公钥确认的提示了。

hostlist.txt 是我们要添加的所有的ip

cat hostlist.txt

192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5
192.168.1.6
192.168.1.7
192.168.1.8
192.168.1.9
192.168.1.10

结果:

用法

ssh-keyscan
usage: ssh-keyscan [-46cHv] [-f file] [-p port] [-T timeout] [-t type]
                   [host | addrlist namelist] ...

参数解释

参数释义
-p远程主机的端口
-f从指定文件中读取主机列表
-t密钥类型:rsa、dsa、ecdsa、ed25519,不缺分大小写
-T设置尝试连接超时时间
-v显示调试信息
-4强制只使用 IPv4 地址
-6强制只使用 IPv6 地址
host、addrlist namelist主机名或IP地址,可以以空格分割写多个ip地址
  • -p port

如果没有指定正确的端口,不报错也不返回任何信息(正常应该返回对应的公钥信息),第一次使用如果因为没有使用正确的端口导致不返回任何信息,会使人产生疑惑,误认为该命令不好使~

  • host | addrlist namelist 示例
ssh-keyscan -p 6233 -t ECDSA 192.168.1.1
ssh-keyscan -p 6233 -t ECDSA 192.168.1.1 192.168.1.2

多个ip之间是并行执行的,没有先后顺序

  • -t type
    有四种密钥类型 rsa、dsa、ecdsa、ed25519,上面的命令中指定的类型为 ECDSA,之所以使用类型 ECDSA 是因为我们在最上面的图片中可以的看到,在输入yes 后会自动添加公钥到 known_hosts,类型就是 ECDSA。当然使用其他类型也可以满足我们的需求,只要有一种类型的的公钥加到known_hosts文件中,再次连接时就不会弹出公钥提示了。不同的服务器支持的类型不太一致,有资料说和ssh协议版本有关系,但是并不确定是否正确。我的服务器支持三种类型,不支持 dsa 类型,不清楚为啥。

如果不指定密钥类型,则返回所有的支持的公钥类型对应的公钥。known_hosts 存在其中一个或多个公钥类型对应的公钥,连接时都不会弹出公钥提示。

ssh-keyscan -p 6233 -t rsa 192.168.1.1
ssh-keyscan -p 6233 -t dsa 192.168.1.1
ssh-keyscan -p 6233 -t ecdsa 192.168.1.1
ssh-keyscan -p 6233 -t ed25519 192.168.1.1
ssh-keyscan -p 6233 192.168.1.1

有资料说支持哪些类型可以在 /etc/ssh/sshd_config 查看,确实有四个密钥类型,并且注释掉了一个dsa,好像对应上了,但是当我修改配置,将其他三个都注释掉或部分注释掉并重启sshd服务后,ssh-keyscan 返回的结果是一样的,还是同样支持三种密钥类型,不支持dsa~

HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key

注释

在上面截图中,我们可以看到没个密钥类型返回的信息中都包含一条注释:

# 192.168.1.1:6233 SSH-2.0-OpenSSH_7.4

这个好像是ssh的版本信息,不知道是在哪里输出的,怎么去掉打印这个注释,注释信息不会添加到 known_hosts 中。

解决方案二:StrictHostKeyChecking

  • StrictHostKeyChecking=no 安全级别最低。如果对应的HostKey在本地不存在,会自动添加到known_hosts,并且给出一个警告。
  • StrictHostKeyChecking=ask 默认的级别。如果对应的HostKey在本地不存在,弹出公钥提示。
  • StrictHostKeyChecking=yes 安全级别最高,如果对应的HostKey在本地不存在,认证失败,拒绝连接。

所以我们可以修改StrictHostKeyChecking为no,这样再第一次连接时就会自动将HostKey添加到known_hosts文件中了,之后再将StrictHostKeyChecking改为默认的ask级别。

全局配置

/etc/ssh/ssh_config 客户端配置,不需要重启sshd服务,注意不是/etc/ssh/sshd_config (服务端配置),这俩文件名相似,我最开始没注意到是客户端配置,修改错了,并且重启sshd服务,导致sshd服务启动失败,会导致服务器无法ssh远程连接。

用户环境配置

~/.ssh/config,如果没有这个文件,可以新建,然后添加 StrictHostKeyChecking=no,这个配置文件要比全局配置文件优先级高。

命令参数

ssh -p 6233 -o StrictHostKeyChecking=no 192.168.1.2

这个需要修改对应的自动化脚本,比如修改 spark的配置文件 spark-env.sh,添加配置

export SPARK_SSH_OPTS="-p 6233 -o StrictHostKeyChecking=no"

但是有些自动化脚本可能不太好添加配置,对于这种方式就不合适了。

参考

  • https://blog.csdn.net/u013958257/article/details/123253942

修改 known_hosts 位置

UserKnownHostsFile ~/dkl/known_hosts

同样是客户端配置,可以在 ~/.ssh/config/etc/ssh/ssh_config 添加该配置项

ssh -p 6233 -o StrictHostKeyChecking=no -o UserKnownHostsFile=~/dkl/known_hosts 192.168.1.2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1398704.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity常用的优化技巧集锦

Unity性能优化是面试的时候经常被问道的一些内容,今天给大家分享一些常用的Unity的优化技巧和思路,方便大家遇到问题时候参考与学习。 对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游…

傲空间私有部署Windows指南

推荐阅读 智能化校园:深入探讨云端管理系统设计与实现(一) 智能化校园:深入探讨云端管理系统设计与实现(二) 安装 docker 请下载对应的 Docker,安装完成后启动。 Docker Desktop for Windows…

【Redis配置】Linux下的Redis安装配置

压缩包方式的Redis下载与安装 进入官网 Redis官网:https://redis.io/download/ 往下翻可以找到其他版本的Redis,或者访问https://download.redis.io/releases/查找自己所需Redis版本。 下载自己所需版本 此处我选择下载的是6.2.14版本 上传到Linux…

Crow:实现点击下载功能

Crow:设置网站的index.html-CSDN博客 讲述了如何完成一个最简单的网页的路由 很多网页提供了下载功能,怎么实现呢,其实也很简单。 假设网页的目录结构如图 $ tree static static ├── img │ └── goodday.jpg └── index.html //index.html <html> <body&…

VMnet1、VMnet8到底是什么?

VMnet1、VMnet8到底是什么&#xff1f; 当我们安装VMware Workstation后&#xff0c;在宿主机(物理电脑)上会多出两个网卡VMNet1、VMNet8。 VMnet1和VMnet8是两个虚拟网卡&#xff0c;主要作用是让虚拟机可以通过你的宿主机的网线上网。 VMnet1是为host-only方式服务的&#x…

CSS实现平行四边形

1、为什么实现平行四边形 在日常开发过程中&#xff0c;有些时候我们可以会遇到一种情况&#xff0c;如可视化大屏中要求我们横线实现对应的进度条&#xff0c;但进度条的内容是由无数个平行四边形组装类似于进度条的形式&#xff0c;那么我们就需要使用CSS来进行对应的实现。 …

后台管理系统: 数据可视化基础

数据可视化简单理解&#xff0c;就是将数据转换成易于人员辨识和理解的视觉表现形式&#xff0c;如各种 2D 图表、3D 图表、地图、矢量图等等。 例如Excel等等 canvas <canvas> 标签只是图形容器&#xff0c;相当于一个画布&#xff0c;canvas 元素本身是没有绘图能力…

内存那点事:让我们一点点的搞懂它

内存是计算机系统中至关重要的组成部分&#xff0c;它不仅储存了运行中的程序和数据&#xff0c;还直接关系到系统的性能和稳定性。让我们一起深入探讨Linux系统下内存管理的核心原理&#xff0c;揭开它的神秘面纱。 基础概念 物理地址 概念&#xff1a;物理地址是指计算机内…

一个关于自动化工具的操作手册

整体 整个软件由首页、设计页构成 首页 按钮功能 清除缓存&#xff1a;主要为了避免线程占用的问题&#xff0c;端口占用无法重新执行。所以操作执行任务、修改任务、新建任务没有响应时&#xff0c;可以操作该事件新建任务&#xff1a;顾名思义就是创建一个网页自动化任务执…

世界上真的存在比苹果品质还好的笔记本电脑吗?

苹果笔记本电脑的品质一直是业界标杆&#xff0c;但它真的是最好的吗&#xff1f;答案是肯定的&#xff0c;但也要看你怎么定义“好”。为什么mac那么贵&#xff0c;还有很多人买&#xff1f;探索高性能的Mac系列&#xff0c;包括 MacBook Pro、Mac Studio和Mac Pro&#xff0c…

后台管理系统: spu管理模块

spu管理模块业务 spu 可以理解为类 例如 people类【spu】 sku可以理解为实例 例如&#xff1a;小明 18 男 spu跟sku可以理解为类跟多个实例的关系 spu管理模块静态 <template><div><el-card style"margin: 20px 0px"><CategorySelect get…

视频剪辑技巧:一键批量制作画中画视频的方法,高效提升剪辑任务

在数字媒体时代&#xff0c;视频剪辑已成为一项重要的技能。无论是专业的影视制作&#xff0c;还是日常的社交媒体分享&#xff0c;掌握视频剪辑技巧都能为内容增色不少。下面来看云炫AI智剪如何高效的剪辑视频技巧&#xff1a;一键批量制作画中画视频的方法&#xff0c;帮助您…

【日常聊聊】边缘计算的挑战和机遇

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 边缘计算的挑战和机遇 一&#xff1a;数据安全与隐私保护 二&#xff1a;网络稳定性与可靠性 三&#xff1a;实时性与性能优…

SpringCloud-高级篇(十四)

缓存的作用是其实就是为了减轻对数据库的压力&#xff0c;缩短服务响应的时间&#xff0c;从而提高整个服务的并发能力&#xff0c;Redis单节点并发其实已经很高了&#xff0c;但是它依然有自己的上限&#xff0c;随着互联网的发展&#xff0c;用户低量越来越大&#xff0c;想淘…

list列表可编辑状态

有时候list需要修改或选择属性,mfc自带的只能显示内容,基本上是不可以修改,为了实现这个功能需求,需要完成一下步骤转换. 第一步记录选择的单元格. 第二步创建一个编辑框CComboBox对象, 设置字体,窗口属性. 第三步获取选中单元格的位置信息. 第四步获取单元格内容信息. 第五步…

C++ STL容器详解

string容器 string的基本概念 本质 string是C风格的字符串&#xff0c;而string本质上是一个类 string与char* 的区别 char * 是一个指针 string是一个类&#xff0c;类内部封装了char*&#xff0c;管理这个字符串&#xff0c;是一个char*型的容器。 string的构造函数 构造函…

数据库性能优化的解决方案

目录​​​​​​​ 1、什么是数据库性能优化 1.1 数据库性能优化的概念 1.2 为何需要进行数据库性能优化 1.3 数据库性能优化的好处 2、数据库性能优化的基本原理 2.1 数据库查询优化 2.2 数据库索引优化 2.3 数据库表结构优化 2.4 数据库硬件优化 3、数据库查询优化…

机床导轨误差对机械加工品质的影响

机床导轨是确定机床各部件相对位置关系的基准&#xff0c;也是相对运动的基准&#xff0c;其精度直接决定了机械加工产品的精度&#xff0c;机床导轨要确保精准,才能保证机械加工产品的良好&#xff0c;否则&#xff0c;会影响加工品质&#xff0c;主要体现在以下几方面&#x…

力扣刷MySQL-第六弹(详细讲解)

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;力扣刷题讲解-MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出…

C++——函数的定义

1&#xff0c;概述 作用&#xff1a;将一段经常使用的代码封装起来&#xff0c;减少重复代码 一个较大的程序&#xff0c;一般分为若干个程序块&#xff0c;每个模块实现特定的功能。 2&#xff0c;函数的定义 函数的定义一般主要有五个步骤&#xff1a; 1&#xff0c;返回…