批量实现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基于密钥认证过程:

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

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

复制公钥至远程主机:ssh-copy-id [-i indetify_file ][[email protected]_ip]

-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:主机文件列表,内容格式"[[email protected]]host[:port]"

-H:主机字符串,内容格式"[[email protected]]host[:port]"

- :登录使用的用户名 

-p:并发的线程数[ 可选 ]

-o:输出的文件目录[ 可选 ] 

-e:错误输入文件[ 可选 ] 

-t:TIMEOUT 超时时间设置,0无限制[ 可选 ] 

-O:SSH的选项 

-v:详细模式 

-A:手动输入密码模式 

-x:额外的命令行参数使用空白符号,引号,反斜线处理 

-X:额外的命令行参数,单个参数模式,同-x 

-i:每个服务器内部处理信息输出 -P:打印出服务器返回信息

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

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

SHELL脚本实现



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

[[email protected] 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:                [email protected]

# 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 [email protected]$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地址即登录用户名密码的文件实例:

[[email protected] app]# cat host_ip.txt 

172.18.14.123 root 123456

172.18.254.54 root 123456

...

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

原文地址:https://www.cnblogs.com/30go/p/11458457.html

时间: 2024-08-03 09:57:27

批量实现ssh免密登录的相关文章

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

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

SSH免密登录机制

 SSH免密登录机制:(见下图) 1.A先使用ssh-keygen生成一对公钥和私钥:ssh-keygen 2.将A的公钥复制给B一份,并且将其追加到B的授权文件中:ssh-copy-id B 3.接下来ssh B,就能免密登录. 为什么将A的公钥拷给B中的授权文件中就能免密登录了呢? 因为在执行ssh B命令时,B中会用A的公钥随机加密一段密文返回给A,A在接收到密文以后,就会用自己的私钥对密文进行解密, 如果能被解密,就允许免密登录,如果不能被解密,就无法登录.由公钥加密的内容,只能由私钥解

SSH免密登录(并且免yes交互)

问题描述:主机A使用ssh协议远程主机B,默认会开启口令认证,即输入主机B对应用户的登录密码,并且第一次登录时,主机A需验证是否接受来自主机B的公钥,输入"yes/no"完成交互.实现ssh免密登录和免yes交互可提高服务器管理效率. 实现思路:1. 主机A创建密钥对id_rsa,id_rsa.pub,并将公钥id_rsa.pub上传至主机B,保存为/root/.ssh/authorized_keys文件: 2. 修改主机B的sshd服务配置文件/etc/ssh/sshd_config

【Linux】ssh免密登录

一.ssh免密配置 ssh 无密码登录要使用公钥与私钥.linux下可以用用ssh-keygen生成公钥/私钥对,下面我以CentOS为例. 有机器A(192.168.1.155),B(192.168.1.181).现想A通过ssh免密码登录到B. 1.在A机下生成公钥/私钥对. [[email protected] ~]$ ssh-keygen -t rsa -P '' -P表示密码,-P '' 就表示空密码,也可以不用-P参数,这样就要三车回车,用-P就一次回车.它在/home/chenlb

linux(十)配置ssh免密登录实现

知道ssh的朋友应该知道它是用来干什么的,如果你不知道什么是ssh远程登录的话,可以去看一下我的上一篇博客,关于linux的网络基础的知识.备注:ssh是用于远端登入.执行ssh指令开启终端机阶段作业,并登入远端主机. 一.ssh远程登录 今天要和大家说的是,当我们一台客户机要远程登录到服务器的时候,输入密码才能登录成功. 过程流程图: 所以我们在想能不能我们不需要输入密码,直接使用ssh 用户名@服务器ip就可以登录呢? 二.ssh免密登录原理 看到这个图可能大家有一点蒙逼.我给大家解释一下.

Hadoop用户配置ssh免密登录

一般生产环境 Hadoop组件都是由hadoop用户来启动,首先需要配置hadoop用户ssh免密登录 1.创建Hadoop用户 [[email protected] ~]# useradd hadoop [[email protected] ~]# id hadoop uid=1102(hadoop) gid=1102(hadoop) groups=1102(hadoop) [[email protected] ~]# passwd hadoop Changing password for u

[原创] SSH免密登录设置----原理详解

首先介绍一下SSH: 当我们用一台服务器登录另一台服务器可直接使用SSH协议进行登陆: //具体格式: // ssh [用户名]@[IP] ssh [email protected]192.168.33.12 也可以直接远程传送文件到另一台服务器,具体格式如下: //具体格式: // scp [文件名] [目标服务器用户名]@[目标服务器IP] : [目标复制位置] scp test.txt [email protected]192.168.33.12:/home 注意:以上操作方法存在弊端,每

宿主机ssh免密登录docker容器

一.检查系统内核 二.安装docker 1.yum install docker  -y 2.docker version                    #查看docker版本 3.systemctl restart docker     #启动docker服务 4.groupadd docker & useradd -g docker docker 三.安装镜像 docker pull [选项] :标签 docker pull centos:7 docker images       

CentOS6、CentOS7、Ubuntu 一键部署 ssh 免密登录

CentOS6.CentOS7.Ubuntu 一键部署 ssh 免密登录(ssh.py 文件) 192.168.1.5 为主机器,其他为控制机. vim /home/shad.py from fabric.api import run,env,parallel env.hosts = ['192.168.1.1', '192.168.1.2', '192.168.1.3'] env.user = 'root' env.parssword = '123456' #@parallel def nam