Linux 批量添加 known_hosts

前言

我们在做完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.txt192.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.rhkb.cn/news/242642.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Linux C编程实战》笔记:信号的捕捉和处理

Linux系统中对信号的处理主要由signal和sigaction函数来完成&#xff0c;另外还会介绍一个函数pause&#xff0c;它可以用来响应任何信号&#xff0c;不过不做任何处理 signal函数 #include <signal.h> void (*signal(int signum, void (*handler)(int)))(int);可以分解…

街机模拟游戏逆向工程(HACKROM)教程:[14]68K汇编-标志寄存器

在M68K中&#xff0c;有许多条件分支指令&#xff0c;和jmp指令一样也会修改PC达到程序跳转或分支的目的&#xff0c;不过这些会根据一些情况或状态来选择是否跳转。而在M68K中&#xff0c;有一个特别的寄存器来标记这些情况。 CCR(状态标志寄存器) CCR寄存器是用来保存一些对…

微服务不死 — 共享变量在策略引擎项目的落地详解

01 背景 1、共享变量的提出 前段时间&#xff0c;来自亚马逊 Prime Video 团队的一个案例研究在开发者社区中掀起了轩然大波。大体是这样一件事&#xff0c;作为一个流媒体平台&#xff0c;Prime Video每天都会向客户提供成千上万的直播流。为了确保客户无缝接收内容&#xff0…

【React】Redux的使用详解

文章目录 Redux的三大原则Redux官方图react-redux使用 1、创建store管理全局状态​ 2、在项目index.js根节点引用 3、 在需要使用redux的页面或者组件中&#xff0c;通过connect高阶组件映射到该组件的props中 redux中异步操作如何使用redux-thunkcombineReducers函数 Re…

MySQL---多表查询综合练习

创建dept表 CREATE TABLE dept ( deptno INT(2) NOT NULL COMMENT 部门编号, dname VARCHAR (15) COMMENT 部门名称, loc VARCHAR (20) COMMENT 地理位置 ); 添加dept表主键 mysql> alter table dept add primary key(deptno); Query OK, 0 rows affected (0.02 s…

Unity3D学习之UI系统——GUI

文章目录 1. 前言2. 工作原理和主要作用3. 基础控件3.1 重要参数及文本和按钮3.1.1 GUI 共同点3.1.2 文本控件3.1.3 按钮控件 3.2 多选框和单选框3.2.1 多选框3.2.2 单选框3.2.3 输入框3.2.4 拖动条 3.3 图片绘制和框3.3.1 图片3.3.2 框绘制 4 工具栏和选择网格4.1 工具栏4.2 选…

2024年网络安全比赛--内存取证(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 1.从内存文件中找到异常程序的进程,将进程的名称作为Flag值提交; 2.从内存文件中找到黑客将异常程序迁移后的进程编号,将迁移后的进程编号作为Flag值提交; 3.从内存文件中找到受害者…

【Docker篇】详细讲解容器相关命令

&#x1f38a;专栏【Docker】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 &#x1f384;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f6f8;容器&#x1f339;相关命令&#x1f354;案例⭐创建并运…

【C++】文件操作

文件操作 一、文本文件&#xff08;一&#xff09;写文件读文件 二、二进制文件&#xff08;一&#xff09;写文件&#xff08;二&#xff09;读文件 程序运行时产生的数据都属于临时数据&#xff0c;程序一旦运行结束都会被释放&#xff0c;通过文件可以将数据持久化&#xff…

SQL注入实战:盲注

盲注&#xff1a; 1、当攻击者利用SQL注入漏洞进行攻击时&#xff0c;有时候web应用程序会显示&#xff0c;后端数据库执行SQL查询返回的错误信息&#xff0c;这些信息能帮助进行SQL注入&#xff0c;但更多时候&#xff0c;数据库没有输出数据web页面&#xff0c;这是攻击者会…

【设计模式】责任连模式怎么用?

我将通过一个贴近现实的故事——请假审批流程&#xff0c;带你了解和掌握责任链模式。 什么是责任链模式&#xff1f; 责任链模式是一种行为设计模式&#xff0c;它让你可以避免将请求的发送者与接收者耦合在一起&#xff0c;让多个对象都有处理请求的机会将这个对象连成一条…

SpringMVC传递数据给前台

SpringMVC有三种方式将数据提供给前台 第一种 使用Request域 第二种 使用Model&#xff08;数据默认是存放在Request域中&#xff09; 与第一种方式其实是一致的 第三种 使用Map集合&#xff08;数据默认是存放在Request域中&#xff09;

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

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

Django随笔

关于Django的admin 1. 在url中把 from django.contrib import admin 重新解开 把path(admin/,admin.site.urls), 解开 2. 注册app&#xff0c;在配置文件中写 django.contrib.admin, 3.输入命令进行数据库迁移 Django国际化 配置文件中&#xff08;改成中文&#xff09; LA…

linux LPT和COM回路测试(基于python+Qt+C++)

软件UI: 回路治具&#xff08;COMLPT&#xff09;&#xff1a; lpt_test.cpp&#xff08;c 源代码&#xff09;&#xff1a; #include <iostream> #include <fstream> #include <sstream> #include <unistd.h> #include <fcntl.h> #include <…

【cucumber】cluecumber-report-plugin生成测试报告

cluecumber为生成测试报告的第三方插件&#xff0c;可以生成html测报&#xff0c;该测报生成需以本地json测报的生成为基础。 所以需要在测试开始主文件标签CucumberOptions中&#xff0c;写入生成json报告。 2. pom xml文件中加入插件 <!-- 根据 cucumber json文件 美化测…

ckman:非常好用的ClickHouse可视化集群运维工具

概述 什么是ckman ckman&#xff0c;全称是ClickHouse Management Console&#xff0c; 即ClickHouse管理平台。它是由擎创科技数据库团队主导研发的一款用来管理和监控ClickHouse集群的可视化运维工具。目前该工具已在github上开源&#xff0c;开源地址为&#xff1a;github…

YOLOv8改进 | Conv篇 | 在线重参数化卷积OREPA助力二次创新(提高推理速度 + FPS)

一、本文介绍 本文给大家带来的改进机制是一种重参数化的卷积模块OREPA,这种重参数化模块非常适合用于二次创新,我们可以将其替换网络中的其它卷积模块可以不影响推理速度的同时让模型学习到更多的特征。OREPA是通过在线卷积重参数化(Online Convolutional Re-parameteriza…

2024最新 8 款电脑数据恢复软件推荐分享

数据恢复是一个涉及从设备硬盘驱动器检索已删除文件的过程。这可能需要存储在工作站、笔记本电脑、移动设备、服务器、相机、闪存驱动器上的数据——任何在独立或镜像/阵列驱动器上存储数据的东西&#xff0c;无论是内部还是外部。 在某些情况下&#xff0c;文件可能被意外或故…

Pytest 测试框架与Allure 测试报告——Allure2测试报告-L3

目录&#xff1a; allure2报告中添加附件-图片 Allure2报告中添加附件Allure2报告中添加附件&#xff08;图片&#xff09;应用场景Allure2报告中添加附件&#xff08;图片&#xff09;-Python代码示例&#xff1a;allure2报告中添加附件-日志 Allure2报告中添加附件&#xff…