批量实现ssh免密登录

摘要:
例如,ssh免密码登录与pssh和自动配置脚本等推送工具结合使用既方便又有用。本节将以shell脚本的形式详细介绍如何通过ssh无密码登录来配置和管理数百台计算机。随着明文通信协议telnet逐渐退出历史舞台,ssh作为一种安全的远程登录工具更受用户欢迎。经过以上两个步骤,您可以实现ssh免密码登录。下次使用ssh登录172.18.14.123时,您将不会输入密码。无密码登录后,pssh将充分发挥其功能。

本节索引


  • 场景分析
  • 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
spawn ssh 172.18.8.100
expect {
    "yes/no" { send "yes ";exp_continue }      # 替你回答下载公钥是的提示
    "password" { send "your_passwd " }         # 提示输入密码
}
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 ";exp_continue}     # expect 实现自动输入密码
                "password" { send "$pass_word "}
        }
        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
...

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

 

免责声明:文章转载自《批量实现ssh免密登录》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ModbusRTU控制SV660P说明一不注意,在Unity3D中DllImport 引起的Bug.下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

VMware虚拟机里centos7下安装mysql5.6并授权远程连接Navicat

这节来安装Mysql5.6,并远程授权连接本地windows的Navicat,可以根据以下步骤安装。此文章为自己收藏,必要时拿出来直接用的,有需要的友友可以查看查看的。文章图片有借助于网络的。 1.新开的云服务器,需要检测系统是否自带安装mysql # yum list installed | grep mysql 2.如果发现有系统自带mysql,果断这...

BotVS配置托管者-基于新浪云

1. 创建SAE应用 登录新浪云平台,点击创建新应用 2. SAE环境部署 在新应用中选择自定义 相应选项如下 开发语言:自定义 运行环境:云容器 语言版本:自定义 部署方式:手工部署 操作系统:系统 centos 版本7 环境配置:基础 应用信息:填写二级域名及应用名称 3. 确认环境信息 查看信息及价格 4....

Git 【管理篇】

Git 介绍 Git 是什么?傻瓜内容跟踪器(The stupid content tracker)!Git 创始人、Linux 之父 Linus Torvalds 就是这样介绍 Git 的。 Git 是用于 Linux 内核开发的版本控制工具。与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,服务器端软件支持不再...

多git账号配置解决方案

生成密钥 ssh-keygen -t rsa -C "gitlab 用户邮箱地址" ←┘ Generating public/private rsa key pair. Enter file in which to save the key (/Users/user/.ssh/id_rsa): ←┘ Enter passphrase (empty for...

ubuntu16.04里如何正确添加用root用户来登录图形界面(图文详解)

  不多说,直接上干货! Ubuntu版本都默认不允许使用root登录,必须要改配置文件。 第一步:   首先设置root密码,利用现有管理员帐户登陆Ubuntu,在终端执行命令:sudo passwd root,接着输入密码和root密码,重复密码。这样就有了可用的root用户。  第二步:   默认情况是不允许用root帐号直接登录图形界面的。这可以...

生成CPIO格式的initrd

因为initrd.img只是系统启动的一个虚拟磁盘而已,系统启动完成后就没有用处了,因此,我决定用busybox来完成一些必要的启动工作(用的是busybox-1.5.1,配置文件如下) cd /tmp mkdir initrd cd initrd mkdir dev proc sys lib mnt mkdir -p lib/modules/kernel...