zoukankan      html  css  js  c++  java
  • ssh免密登录

    原文地址:https://www.linuxidc.com/Linux/2017-10/147377.htm

    本节索引


    • 场景分析
    • 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
    ...

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

    本章总结


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


    以上是原文内容。在测试过程中,有个问题

    [***@***01 ~]$ ssh-copy-id -i .ssh/id_rsa.pub 10.13.40.**
    ssh: connect to host 10.13.40.** port 22: Connection refused

    由于服务端的端口做了修改,所以默认的22端口就会报错。可以通过如下方式传输

    [***@**01 ~]$ ssh-copy-id -i .ssh/id_rsa.pub "-p 22000 ***@10.13.40.**"
    ***@10.13.40.**'s password:
    Now try logging into the machine, with "ssh '-p 22000 ***@10.13.40.**'", and check in:
    
      .ssh/authorized_keys
    
    to make sure we haven't added extra keys that you weren't expecting.
    
    [***@**01 ~]$ ssh -p 22000 10.13.40.**
    Last login: Tue Apr 24 14:30:34 2018 from **01

    测试成功

  • 相关阅读:
    高盛、沃尔玛 题做出来还挂了的吐槽
    amazon师兄debrief
    到所有人家距离之和最短的中点 296. Best Meeting Point
    问问题没人回答的情况怎么办终于有解了
    找名人 277. Find the Celebrity
    数组生存游戏 289. Game of Life
    547. Number of Provinces 省份数量
    428. Serialize and Deserialize Nary Tree 序列化、反序列化n叉树
    alias别名简介和使用
    面试官:线程池执行过程中遇到异常会发生什么,怎样处理? Vincent
  • 原文地址:https://www.cnblogs.com/binbinyouni/p/8931095.html
Copyright © 2011-2022 走看看