[转帖]自动化配置SSH免密登录和取消SSH免密配置脚本
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">&></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">&></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">&></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">"请输入序号>>> "</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"><</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"><<-</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"><<-</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"><</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"><<-</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> /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强制退出脚本

代码干货分享,如果你有不一样的想法,欢迎一起交流学习~
[转帖]自动化配置SSH免密登录和取消SSH免密配置脚本的更多相关文章
- SANGFOR AC配置AD域单点登录(一)----AC侧配置
一.需求 1. AD域单点登录适用于客户内网已有AD域统一管理内网用户,部署AC后,希望AC和AD域结合实现平滑认证.即终端PC开机通过域帐号登录AD域后自动通过AC认证上网,无需再次人为通过AC认证 ...
- (11)ssh免密登录配置
***在Linux命令行中登录到另一台虚拟机(需要用到ssh协议) Linux中默认有ssh的服务器端和客户端,客户端的名字就叫ssh 前提是当前使用的用户名在待连接的虚拟机中存在 格式: ssh ...
- SSH配置免密登录
[参考文章]:linux服务器ssh免密码登录 [参考文章]:ssh分发秘钥时出现错误“Permission denied (publickey,gssapi-keyex,gssapi-with-mi ...
- CentOS 配置远程主机ssh免密登录
ssh针对的是用户不是机器,同一机器不同用户需要单独配置ssh,才能实现该用户的免密登录 cd ~ cd ./.ssh 在./ssh目录下生成公钥与私钥(如果没有.ssh先使用ssh命令连接到一台远程 ...
- 本地CentOS8 配置ssh免密登录服务器
准备工作: 1.确认本机sshd的配置文件(需要root权限) $ vi /etc/ssh/sshd_config 找到以下内容,并去掉注释符"#" AuthorizedKeysF ...
- 配置ssh免密登录
安装ssh sudo apt-get install ssh 产生密钥:ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa (rsa为ssh的加密方式 ...
- 二、集群配置SSH免密登录
一.以3个几点为例,分别为master.slave01.slave02 1.分别生成自己节点密钥对 master: 创建dsa免密代码:ssh-keygen -t dsa -P '' -f ~/.ss ...
- Linux入门——SSH免密登录
SSH免密登录 1.简介 SSH是一种网络协议,用于计算机之间的加密登录. 本文针对的实现是OpenSSH,它是自由软件,应用非常广泛. 2.初始化公钥私钥 有rsa,dsa两种加密方式,生成的公钥私 ...
- 集群ssh服务和免密码登录的配置
安装Hadoop之前,由于集群中大量主机进行分布式计算需要相互进行数据通信,服务器之间的连接需要通过ssh来进行,所以要安装ssh服务,默认情况下通过ssh登录服务器需要输入用户名和密码进行连接,如果 ...
- ssh 免密登录
一,单机秘密登录 进入/etc/ssh 文件夹 编辑sshd_config 文件(sshd_config是ssh 服务端文件,ssh_config是客户端文件) sudo vi sshd_config ...
随机推荐
- 如何保证XML正确性
如何保证XML正确性 XML是个盒子,什么都能装,但是装进去的东西正确与否恐怕无法得知.往往我们都人工审核.双人复核保证,但是次数多了难免会出错.那么我们如何保证和避免这种问题出现呢? 那就是XSD, ...
- Kmesh内核级流量治理,服务转发性能提升50%+
本文分享自华为云社区<DTSE Tech Talk | 第49期:Kmesh内核级流量治理,服务转发性能提升50%+!>,作者:华为云社区精选. 数据面时延开销,无法满足应用SLA诉求?内 ...
- 华为扫地僧:揭秘IoT+鸿蒙帮助企业突围物联网安全问题
摘要:通过介绍物联网安全架构以及华为云IoT+鸿蒙端边云协同安全实践,意在通过华为云IoT+鸿蒙帮助企业解决物联网安全问题. 在本期#码出未来,与你同行#HDC.Cloud2023华为云开发者社区系列 ...
- 又双叒叕种草了新家装风格?AI帮你家居换装
摘要:又双叒叕种草了家装新风格?想要尝试却又怕踩雷?如果能够轻松Get量身定制的家装风格图,那该多好啊.现在,这一切都成为了可能! 本文分享自华为云社区<又双叒叕种草了新家装风格?AI帮你家居换 ...
- 初学开发必看:何为Git,何为SVN
摘要:在和客户交流代码开发的过程中,时常会先入为主的交流起Git:但在和很多中小型企业交流的过程,发现SVN的模式也被使用得很频繁.那么两者的具体差异有哪些呢? 本文分享自华为云社区<Git V ...
- 近数据处理(NDP)——GaussDB(for MySQL)性能提升的秘密
摘要:云堆栈的深度集成是释放云数据库力量的关键,华为云在实现这一目标方面处于领先地位,正如GaussDB(for MySQL)所证明的那样. 本文分享自华为云社区<近数据处理(NDP),为Gau ...
- iOS应用上架详细图文教程
App Store作为苹果官方的应用商店,审核严格周期长一直让用户头疼不已,很多app都"死"在了审核这一关,那我们就要放弃iOS用户了吗?当然不是!本期我们从iOS app上 ...
- 火山引擎云原生数据仓库 ByteHouse 技术白皮书 V1.0 (Ⅲ)
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 近日,<火山引擎云原生数据仓库 ByteHouse 技术白皮书>正式发布.白皮书简述了 ByteHou ...
- Windows 2016 2019 显示桌面图标
运行cmd窗口 输入命令 rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0 弹出桌面图标设置窗口
- Windows 清理C盘空间,将桌面,文档等移D盘
一般用户数据文件,缓存文件等,会默认放在C盘.而且有些程序必须装在C盘,久而久之,C盘空间越来越小,到后面没办法再安装使用一些程序. 可以将一些常用的移到D盘:特别是微信,动不动就几十个G的空间被占用 ...