[转帖]自动化配置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 ...
随机推荐
- Skywalking(8.7)安装以及docker镜像打包
Skywalking安装以及docker镜像打包 Skywalking版本:apache-skywalking-apm-es7-8.7.0 ES版本:7.17.2 一.下载Skywalking的安装包 ...
- 一文带你了解EiPaaS和EiPaaS的国际趋势
摘要:EiPaaS (Enterprise Integration Platform as a Service) 是企业级的集成平台和服务. 本文分享自华为云社区<初识EiPaaS和EiPaaS ...
- AI辅助宫颈癌筛查技术全球居首,守护者的力量来源是?
宫颈癌,是常见的妇科恶性肿瘤.宫颈癌发病率在妇科恶性肿瘤中仅次于乳腺癌,但同时也是医学界公认的病因明确,预防有疫苗.且早期治愈率高的病症!病理形态学诊断被医学界公认为疾病诊断的"金标准&qu ...
- 大力出奇迹,揭秘昇腾CANN的AI超能力
摘要:CANN(Compute Architecture for Neural Networks)异构计算架构,是以提升用户开发效率和释放昇腾AI处理器极致算力为目标,专门面向AI场景的异构计算架构. ...
- 实践GoF的设计模式:单例模式
摘要:单例模式虽然简单易用,但也是最容易被滥用的设计模式.它并不是"银弹",在实际使用时,还需根据具体的业务场景谨慎使用. 本文分享自华为云社区<[Go实现]实践GoF的23 ...
- 再谈BOM和DOM(6):dom对象及event对象位值计算—如offsetX/Top,clentX
总是会被javascript的event对象的clientX,offsetX,screenX,pageX 弄得头晕,于是决定做个图来区分一下(画得我手那个酸呀....) event对象位置信息获取 先 ...
- 日常问题杂记-updating
python3新式类的解析顺序-C3算法由来 - mro-resolution-order canvas文本绘制 - 参考链接 高性能渲染大批量数据 - 参考链接 virtualized list - ...
- 3-3 vector 和 迭代器
1 vector 容器vector可以理解为变长数组,它里面放的是相同类型的元素. vector<int> vec={1,2,3,4};//拷贝构造 vector<string> ...
- cookie与session简介 django操作cookie django操作session
目录 cookie与session简介 早期cookies 随机字符串解决cookies安全问题 禁止浏览器保存cookies django操作cookie set_cookie set_signed ...
- WPF 水印装饰器
使用AdornerDecorator装饰器实现WPF水印 水印装饰器WatermarkAdorner类代码: using System; using System.Collections.Generi ...