Shell脚本实现ssh免密登录及批量配置管理

前端之家收集整理的这篇文章主要介绍了Shell脚本实现ssh免密登录及批量配置管理前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

本节索引


  • 场景分析

  • ssh免密登录

  • pssh工具批量管理

  • SHELL自动化脚本

  • 本篇总结


场景分析


作为一个运维工程师,不是每个人工作的环境都想阿里、腾讯那样,动不动就上亿的PV量,上万台服务器。我们通常还是工作在,几十台上百台服务器这样的环境,而使用ansible或者puppet这样的自动化运维工具则显得大材小用,并且最终的效果可能还不如几个小工具达到的效果好。像ssh免密登录在配合pssh这样的推送工具,在配合自动化配置脚本,可以说是即方便也使用。这一节将详细带大家以shell脚本的形式实现ssh免密登录进行百台机器的配置和管理。


ssh服务


随着明文通信协议telnet渐渐退出历史舞台,ssh这个作为安全的远程登录工具,更加受广大用户的青睐。SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台。几乎所有UNIX平台―包括HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix,以及其他平台,都可运行SSH。

ssh服务有两种验证用户登录的方式,一种是基于密码口令的认证,一种是基于密钥的认证,本文主要是实现基于密钥的认证。ssh基于密钥认证过程:

wKioL1naFYGxqnPsAACTluQeBiY673.png

ssh工具不仅仅提供了远程登录功能,他还自带了一些命令工具,能够生成ssh会话密钥,并且能够将生成密钥对的公钥复制到远程主机,例如:

生成密钥ssh-keygen -t rsa [-P ''] [-f '~/.ssh/id_rsa']

wKioL1nZzv-S5BgGAABFPIA92cg277.png

复制公钥至远程主机ssh-copy-id [-i indetify_file ][user@host_ip]

wKiom1nZz2GAu_pxAABVv8MpkWc120.png

-p表示指定私钥密码,上面我没有对私钥进行加密,主要是方便,在实际生产中建议对私钥进行加密,因为如果不小心丢了私钥,你的整个系统都将面临很大的风险。通过上面两步之后你就可以实现ssh免密码登录了,下次你在用ssh登录到172.18.14.123(有你公钥的主机)时将不在输入密码。

不过这里我们会发现,我们在复制公钥的时候还是需要手动输入密码,我们可以使用shell脚本编程中的expect语法,他能代替我们输入登录密码

#!/usr/bin/expect
spawnssh172.18.8.100
expect{
"yes/no"{send"yes\n";exp_continue}#替你回答下载公钥是的提示
"password"{send"your_passwd\n"}#提示输入密码
}
interact
expecteof


pssh工具


在上面的例子中我们发现,我们仅仅是实现了一台主机的ssh免密码登录,而我们的环境至也得有几十台机器,这远远没有达到我们的目的“自动化部署、配置、管理”;前辈有言:如果你的同一个操作大于3次,那么你就要考虑使用自动化方式了。所以,我们还得做进一步的改善,此时我们想到了一个功能很强大的小工具pssh。

pssh命令是一个python编写可以在多台服务器上执行命令的工具,同时支持拷贝文件,是同类工具中很出色的,类似pdsh,个人认为相对pdsh更为简便,使用必须在各个服务器上配置好密钥认证访问。做了免密登录之后,pssh将发挥它最大的功能。下面说说pssh的参数。

*****pssh的选项参数*****

--version:查看版本
--help:查看帮助,即此信息
-h:主机文件列表,内容格式"[user@]host[:port]"
-H:主机字符串,内容格式"[user@]host[:port]"
-:登录使用的用户名
-p:并发的线程数[可选]
-o:输出文件目录[可选]
-e:错误输入文件[可选]
-t:TIMEOUT超时时间设置,0无限制[可选]
-O:SSH的选项
-v:详细模式
-A:手动输入密码模式
-x:额外的命令行参数使用空白符号,引号,反斜线处理
-X:额外的命令行参数,单个参数模式,同-x
-i:每个服务器内部处理信息输出-P:打印出服务器返回信息

我们观察pssh的参数,我们发现-f是指定主机文件,这给我们的潜在意思是,我们可以将ip放置在某个文件中在使用pssh的时候直接调用文件即可,这好像与我们所想的不谋而合。于是我立马将创建了几台虚拟机进行试验,首先ip地址存储在一个ip.txt的文件中,然后试着执行了一下,很好,效果不错!这里只介绍了一些用法,如果你的工作需要用到你可以研究一下其他的参数。

wKiom1nZ1OPT8KQbAAAq5o_QqBg666.png

我去查看了一下两台虚拟机的负载情况,上图显示出来了执行结果,说明可行。当然了我之前手动实现了到两台主机的免密登录


SHELL脚本实现


上面的过程,我们一步步的实现了ssh免密码登录,使用pssh工具实现批量部署管理,当然了我只是去目标主机看了下负载情况,你可以根据你公司的业务编写需要配置或部署的脚本,让后使用pssh推上去并执行即可。那么下面将用一个脚本来实现上述这一切操作。

[root@vinsentapp]#catssh_auto.sh
#!/bin/bash
#!/bin/bash
#------------------------------------------#
#FileName:ssh_auto.sh
#Revision:1.1.0
#Date:2017-07-1404:50:33
#Author:vinsent
#Email:hyb_admin@163.com
#Website:www.vinsent.cn
#Description:Thisscriptcanachievesshpassword-freelogin,#andcanbedeployedinbatches,configuration
#------------------------------------------#
#Copyright:2017vinsent
#License:GPL2+
#------------------------------------------#
[!-f/root/.ssh/id_rsa.pub]&&ssh-keygen-trsa-p''&>/dev/null#密钥对不存在则创建密钥
whilereadline;do
ip=`echo$line|cut-d""-f1`#提取文件中的ip
user_name=`echo$line|cut-d""-f2`#提取文件中的用户名
pass_word=`echo$line|cut-d""-f3`#提取文件中的密码
expect<<EOF
spawnssh-copy-id-i/root/.ssh/id_rsa.pub$user_name@$ip#复制公钥到目标主机
expect{
"yes/no"{send"yes\n";exp_continue}#expect实现自动输入密码
"password"{send"$pass_word\n"}
}
expecteof
EOF

done</root/host_ip.txt#读取存储ip的文件

pscp.pssh-h/root/host_ip.txt/root/your_scripts.sh/root#推送你在目标主机进行的部署配置
pssh-h/root/host_ip.txt-ibash/root/your_scripts.sh#进行远程配置,执行你的配置脚本

host_ip.txt文件可以通过手动写(当然了这就显得不自动化)你可以使用扫描工具扫描你网络中的主机,然后配合awk等工具生成文件。ip地址即登录用户名密码的文件实例:

[root@vinsentapp]#cathost_ip.txt
172.18.14.123root123456
172.18.254.54root123456
...

当然了上述的脚本可能稍显粗略,但功能是完全能够实现的。


本章总结


没有什么事情是一蹴而就的,遇到问题,我们要静下心来思考。思考远比没有目的的实施要好,修一幢大楼总是先设计结构形状(思考),再去实施。做事绝不是几块砖,几根钢筋,几袋水泥。这是我们运维人员更应该学习的,因为在我们的每一次手指的触动,可能就是百万的数据。小工具有时候也能其不小的作用。加油吧~

原文链接:https://www.f2er.com/bash/390243.html

猜你在找的Bash相关文章