批量实现ssh免密登陆

本节索引python


  • 场景分析
  • ssh免密登陆
  • pssh工具批量管理
  • SHELL自动化脚本
  • 本篇总结

场景分析linux


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

ssh服务shell


随着明文通讯协议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会话密钥,而且可以将生成密钥对的公钥复制到远程主机,例如:bash

生成密钥: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
spawn  ssh  172.18.8.100
expect {
     "yes/no"  { send  "yes\n" ;exp_continue }       # 替你回答下载公钥是的提示
     "password"  { send  "your_passwd\n"  }          # 提示输入密码
}
interact
expect eof 

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@vinsent app] # cat ssh_auto.sh 
#!/bin/bash
#!/bin/bash
#------------------------------------------#
# FileName:             ssh_auto.sh
# Revision:             1.1.0
# Date:                 2017-07-14 04:50:33
# Author:               vinsent
# Email:                hyb_admin@163.com
# Website:              www.vinsent.cn
# Description:          This script can achieve ssh password-free login, 
#                       and can be deployed in batches, configuration
#------------------------------------------#
# Copyright:            2017 vinsent
# License:              GPL 2+
#------------------------------------------#
[ ! -f  /root/ . ssh /id_rsa .pub ] &&  ssh -keygen -t rsa -p  ''  &> /dev/null   # 密钥对不存在则建立密钥
while  read  line; do
         ip=` echo  $line |  cut  -d  " "  -f1`              # 提取文件中的ip
         user_name=` echo  $line |  cut  -d  " "  -f2`       # 提取文件中的用户名
         pass_word=` echo  $line |  cut  -d  " "  -f3`       # 提取文件中的密码
expect <<EOF
         spawn  ssh -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" }
         }
         expect eof
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 -i  bash  /root/your_scripts .sh         # 进行远程配置,执行你的配置脚本

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

[root@vinsent app] # cat host_ip.txt 
172.18.14.123 root 123456
172.18.254.54 root 123456
...

固然了上述的脚本可能稍显粗略,但功能是彻底可以实现的。

相关文章
相关标签/搜索