1. 前文

搭建了一套有多台主机的局域网环境,不完全考虑安全性的情况下,为方便管理局域网内主机,配置SSH免密登录,因主机较多,前阵子针对配置ssh免密和取消ssh免密功能单独写了脚本来自动化批量部署,现把两个功能封装在一起做成交互式程序

2.实现代码

#!/bin/bash
#Author:cosann
#Version:0.2
#date:2022/7/27
#description:批量部署SSH免密登录脚本 E_ERROR=65 #传参检测

if [ $# -ne 1 ]

then

echo -e "Usage:$0 ip_list_file "

exit E_ERROR

fi #文件检测

if [ ! -f "$1" ]

then

echo -e "IP_List_File $1文件异常,请检查内容"

exit E_ERROR

fi #初始化

ip_list_file=$1

#从文本读取值初始化变量

ip_address=(</span><span class="token function">awk</span> <span class="token string">'{print $1}'</span> $ip_list_file<span class="token variable">)

username=(</span><span class="token function">awk</span> <span class="token string">'{print $2}'</span> $ip_list_file<span class="token variable">)

password=(</span><span class="token function">awk</span> <span class="token string">'{print $3}'</span> $ip_list_file<span class="token variable">) #安装软件检测及部署环境配置

echo -e "》》》开始检测依赖的必须组件是否安装》》》\n"

if [ </span><span class="token function">rpm</span> -qa <span class="token operator">|</span> <span class="token function">grep</span> <span class="token string">"expect"</span> <span class="token operator">&amp;&gt;</span> /dev/null<span class="token punctuation">;</span><span class="token builtin class-name">echo</span> $?<span class="token variable"> -ne 0 ]

then

echo -e "未安装必须组件Expect,开始执行安装,请稍等..."

( yum install -y expect &> /dev/null && echo -e ">Expect安装完成!" ) || ( echo -e "部署必须组件Expect失败,请检查Yum配置" && exit E_ERROR )

elif [ </span><span class="token function">rpm</span> -qa <span class="token operator">|</span> <span class="token function">grep</span> <span class="token string">"openssl"</span> <span class="token operator">&amp;&gt;</span> /dev/null<span class="token punctuation">;</span><span class="token builtin class-name">echo</span> $?<span class="token variable"> -ne 0 ]

then

( yum install -y openssh &> /dev/null && echo -e ">Openssh安装完成!" ) || ( echo -e "部署必须组件Openssh失败,请检查Yum配置" && exit E_ERROR )

elif [ </span><span class="token function">rpm</span> -qa <span class="token operator">|</span> <span class="token function">grep</span> <span class="token string">"openssh-clients"</span> <span class="token operator">&amp;&gt;</span> /dev/null<span class="token punctuation">;</span><span class="token builtin class-name">echo</span> $?<span class="token variable"> -ne 0 ]

then

( yum install -y openssh-clients &> /dev/null && echo -e ">Openssh-clients安装完成!" ) || ( echo -e "部署必须组件Openssh-clients失败,请检查Yum配置" && exit E_ERROR )

else

echo -e ">必须组件Expect已安装"

echo -e ">必须组件Openssh已安装"

echo -e ">必须组件Openssh-clients已安装"

fi #打印菜单

echo -e "\n="

echo -e "该脚本可以实现批量部署和删除SSH免密配置"

echo -e "Author:Cosann"

echo -e "Create time:2022/07/27"

echo -e "="

while :

do

echo -e ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"

echo -e "1. 配置SHH免密登录"

echo -e "2. 取消SHH免密配置"

echo -e "3. 退出程序"
<span class="token comment">#功能控制及实现</span>
<span class="token builtin class-name">read</span> -p <span class="token string">"请输入序号&gt;&gt;&gt; "</span> nu
<span class="token keyword">if</span> <span class="token punctuation">[</span><span class="token punctuation">[</span> <span class="token string">"<span class="token variable">$nu</span>"</span> <span class="token operator">==</span> <span class="token string">"3"</span> <span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">then</span>
<span class="token comment">#退出程序</span>
<span class="token builtin class-name">echo</span> -e <span class="token string">"<span class="token entity" title="\n">\n</span>###!!!感谢使用,再见!!!###"</span> <span class="token builtin class-name">exit</span> <span class="token number">0</span>
<span class="token keyword">elif</span> <span class="token punctuation">[</span><span class="token punctuation">[</span> <span class="token string">"<span class="token variable">$nu</span>"</span> <span class="token operator">==</span> <span class="token string">"1"</span> <span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">then</span>
<span class="token builtin class-name">echo</span> <span class="token string">"开始推送"</span>
<span class="token comment">#检测公钥文件是否存在,不存在则生成</span>
<span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token operator">!</span> -e <span class="token string">"<span class="token environment constant">$HOME</span>/.ssh/id_rsa.pub"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span><span class="token keyword">then</span>
ssh-keygen -t rsa -P <span class="token string">''</span> -f <span class="token environment constant">$HOME</span>/.ssh/id_rsa
<span class="token keyword">else</span>
<span class="token builtin class-name">echo</span> -e <span class="token string">"》》》已创建公钥文件,开始向远端服务器推送公钥》》》"</span>
<span class="token keyword">fi</span> <span class="token comment">#循环控制</span>
<span class="token assign-left variable">count</span><span class="token operator">=</span><span class="token variable"><span class="token variable">`</span><span class="token function">grep</span> -v <span class="token string">'^$'</span> $ip_list_file <span class="token operator">|</span> <span class="token function">wc</span> -l <span class="token variable">`</span></span>
<span class="token keyword">for</span> <span class="token variable"><span class="token punctuation">((</span> i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>i<span class="token operator">&lt;</span>$count<span class="token punctuation">;</span>i<span class="token operator">++</span> <span class="token punctuation">))</span></span>
<span class="token keyword">do</span>
<span class="token comment">#echo -e "${ip_address[$i]}\t${username[$i]}\t${password[$i]}"</span>
<span class="token comment">#自动化交互实现推送ssh公钥</span>
/usr/bin/expect<span class="token operator">&lt;&lt;-</span><span class="token string">EOF
spawn ssh-copy-id -i <span class="token environment constant">$HOME</span>/.ssh/id_rsa.pub <span class="token variable">${username<span class="token punctuation">[</span>$i<span class="token punctuation">]</span>}</span>@<span class="token variable">${ip_address<span class="token punctuation">[</span>$i<span class="token punctuation">]</span>}</span>
expect {
"*yes/no" { send "yes<span class="token entity" title="\r">\r</span>";exp_continue }
"*password" { send "<span class="token variable">${password<span class="token punctuation">[</span>$i<span class="token punctuation">]</span>}</span><span class="token entity" title="\r">\r</span>" }
}
expect eof

EOF

done

echo -e "--------------------------------------------------------------------------------------"

echo -e "--------------------------------------------------------------------------------------"

echo -e "--------------------------------------------------------------------------------------"

echo -e "###推送完成,尝试免密登录###"

#推送公钥成功免密结果通知

for (( i=0;i<\(count<span class="token punctuation">;</span>i<span class="token operator">++</span> <span class="token punctuation">))</span></span>
<span class="token keyword">do</span>
/usr/bin/expect<span class="token operator">&lt;&lt;-</span><span class="token string">EOF
spawn ssh <span class="token variable">\){username[\(i<span class="token punctuation">]</span>}</span>@<span class="token variable">\){ip_address[$i]}

expect "]#"

send "echo "##登录成功##"\r"

expect "
]#"

send "exit\r"

EOF

done

echo -e "-------------------------------------------"

echo -e "已完成SHH免密配置,请尝试SHH登录远端主机确认"

<span class="token keyword">elif</span> <span class="token punctuation">[</span><span class="token punctuation">[</span> <span class="token string">"<span class="token variable">$nu</span>"</span> <span class="token operator">==</span> <span class="token string">"2"</span> <span class="token punctuation">]</span><span class="token punctuation">]</span>
<span class="token keyword">then</span>
<span class="token comment">#自动化交互实现删除配置免密的远程主机上的authorized_keys</span>
<span class="token assign-left variable">count</span><span class="token operator">=</span><span class="token variable"><span class="token variable">`</span><span class="token function">grep</span> -v <span class="token string">'^$'</span> $ip_list_file <span class="token operator">|</span> <span class="token function">wc</span> -l <span class="token variable">`</span></span>
<span class="token keyword">for</span> <span class="token variable"><span class="token punctuation">((</span> i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>i<span class="token operator">&lt;</span>$count<span class="token punctuation">;</span>i<span class="token operator">++</span> <span class="token punctuation">))</span></span>
<span class="token keyword">do</span>
/usr/bin/expect<span class="token operator">&lt;&lt;-</span><span class="token string">EOF
spawn ssh <span class="token variable">${username<span class="token punctuation">[</span>$i<span class="token punctuation">]</span>}</span>@<span class="token variable">${ip_address<span class="token punctuation">[</span>$i<span class="token punctuation">]</span>}</span>
expect "*]#"
send "rm -f /root/.ssh/authorized_keys 2&gt; /dev/null<span class="token entity" title="\r">\r</span>"
expect "*]#"
send "exit<span class="token entity" title="\r">\r</span>"

EOF

done

echo -e "-------------------------------------------"

echo -e "已取消SHH免密配置,请尝试SHH登录远端主机确认"

<span class="token keyword">else</span>
<span class="token builtin class-name">echo</span> -e <span class="token string">"<span class="token entity" title="\033">\033</span>[41;37m 非法输入,请检查输入!!! <span class="token entity" title="\033">\033</span>[0m"</span>
<span class="token keyword">fi</span>

done

3. 使用方法

3.1 使用前准备

  • 将代码复制到脚本文件,赋予执行权限
  • 提前准备好IP地址用户密码文件

3.2 IP地址用户密码文件格式(注意!!!)

3.3 运行脚本

#脚本名 IP地址用户密码文件
#举例
./ssh.sh host.txt #脚本会判断调用脚本是否有指定IP地址用户密码文件,没有的情况下会运行脚本失败并提示
  • 1
  • 2
  • 3

4. 使用注意

4.1 IP地址用户密码文件格式请按照以上图示标准填写,内容不正确时会出现等待ssh登录或者重试的结果,这时候需要检查配置文件的用户名或者密码是否错误

4.2 未在配置ssh免密的情况使用脚本,需要多次ctrl+c强制退出脚本


代码干货分享,如果你有不一样的想法,欢迎一起交流学习~

文章知识点与官方知识档案匹配,可进一步学习相关知识
云原生入门技能树首页概览13852 人正在系统学习中

[转帖]自动化配置SSH免密登录和取消SSH免密配置脚本的更多相关文章

  1. SANGFOR AC配置AD域单点登录(一)----AC侧配置

    一.需求 1. AD域单点登录适用于客户内网已有AD域统一管理内网用户,部署AC后,希望AC和AD域结合实现平滑认证.即终端PC开机通过域帐号登录AD域后自动通过AC认证上网,无需再次人为通过AC认证 ...

  2. (11)ssh免密登录配置

    ***在Linux命令行中登录到另一台虚拟机(需要用到ssh协议) Linux中默认有ssh的服务器端和客户端,客户端的名字就叫ssh 前提是当前使用的用户名在待连接的虚拟机中存在 格式:  ssh ...

  3. SSH配置免密登录

    [参考文章]:linux服务器ssh免密码登录 [参考文章]:ssh分发秘钥时出现错误“Permission denied (publickey,gssapi-keyex,gssapi-with-mi ...

  4. CentOS 配置远程主机ssh免密登录

    ssh针对的是用户不是机器,同一机器不同用户需要单独配置ssh,才能实现该用户的免密登录 cd ~ cd ./.ssh 在./ssh目录下生成公钥与私钥(如果没有.ssh先使用ssh命令连接到一台远程 ...

  5. 本地CentOS8 配置ssh免密登录服务器

    准备工作: 1.确认本机sshd的配置文件(需要root权限) $ vi /etc/ssh/sshd_config 找到以下内容,并去掉注释符"#" AuthorizedKeysF ...

  6. 配置ssh免密登录

    安装ssh sudo apt-get install ssh 产生密钥:ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa (rsa为ssh的加密方式 ...

  7. 二、集群配置SSH免密登录

    一.以3个几点为例,分别为master.slave01.slave02 1.分别生成自己节点密钥对 master: 创建dsa免密代码:ssh-keygen -t dsa -P '' -f ~/.ss ...

  8. Linux入门——SSH免密登录

    SSH免密登录 1.简介 SSH是一种网络协议,用于计算机之间的加密登录. 本文针对的实现是OpenSSH,它是自由软件,应用非常广泛. 2.初始化公钥私钥 有rsa,dsa两种加密方式,生成的公钥私 ...

  9. 集群ssh服务和免密码登录的配置

    安装Hadoop之前,由于集群中大量主机进行分布式计算需要相互进行数据通信,服务器之间的连接需要通过ssh来进行,所以要安装ssh服务,默认情况下通过ssh登录服务器需要输入用户名和密码进行连接,如果 ...

  10. ssh 免密登录

    一,单机秘密登录 进入/etc/ssh 文件夹 编辑sshd_config 文件(sshd_config是ssh 服务端文件,ssh_config是客户端文件) sudo vi sshd_config ...

随机推荐

  1. 【scikit-learn基础】--『监督学习』之 随机森林分类

    随机森林分类算法是一种基于集成学习(ensemble learning)的机器学习算法,它的基本原理是通过对多个决策树的预测结果进行平均或投票,以产生最终的分类结果. 随机森林算法可用于回归和分类问题 ...

  2. Python压缩JS文件,重点是 slimit

    摘要:Python Web程序员必看系列,学习如何压缩 JS 代码. 本文分享自华为云社区<Python压缩JS文件,PythonWeb程序员必看系列,重点是 slimit>,作者: 梦想 ...

  3. 云小课 | 玩转HiLens Studio之手机实时视频流调试代码

    摘要:在开发技能过程中,搭配视频流调试技能是非常必要的环节,也是检验技能效果的重要环节.HiLens Studio推出使用手机实时视频流调试代码的功能,以手机摄像头实时的视频流作为技能输入,查看技能输 ...

  4. 基于KubeEdge的边缘节点分组管理设计与实现

    摘要:KubeEdge 1.11版本提供了"边缘节点分组管理"新特性,抽象出了跨地域的应用部署模型. 本文分享自华为云社区<基于KubeEdge的边缘节点分组管理设计与实现& ...

  5. Colocate Join :ClickHouse的一种高性能分布式join查询模型

    摘要:本文将介绍业界MPP分布式数据库join查询模型,以及ClickHouse的分布式查询原理解析和Colocate join性能表现. 本文分享自华为云社区<ClickHouse一种高性能分 ...

  6. MRS离线数据分析:通过Flink作业处理OBS数据

    摘要:MRS支持在大数据存储容量大.计算资源需要弹性扩展的场景下,用户将数据存储在OBS服务中,使用MRS集群仅做数据计算处理的存算分离模式. 本文分享自华为云社区<[云小课]EI第47课 MR ...

  7. JerryScript:物联网开发者的得力工具

    摘要:本文档以Linux开发环境及realview-pbx-a9开发板为例,简单介绍LiteOS上jerryscript命令的使用. 本文分享自华为云社区<Jerryscript-让开发者事半功 ...

  8. Java 线程间通信 —— 管道输入 / 输出流

    本文部分摘自<Java 并发编程的艺术> 管道输入 / 输出流 管道输入 / 输出流和普通的文件输入 / 输出流或者网络输入 / 输出流不同之处在于,它主要用于线程之间的数据传输,而传输媒 ...

  9. Hadoop面试题总结(二)——HDFS

    1. HDFS 中的 block 默认保存几份? 默认保存3份 2.HDFS 默认 BlockSize 是多大? 默认64MB 3.负责HDFS数据存储的是哪一部分? DataNode负责数据存储 4 ...

  10. CNCF大使预测:2024年云原生面临倦怠、离职及云成本精简

    本文由 CNCF 大使 Eric D. Schabell 撰写,预测2024年云原生领域最可能发生的3大变化,并与其对云原生可观测性领域的见解结合. 关注云原生倦怠 毫无疑问,在 2023 年中云原生 ...