目录

  • 1 SSH批量分发管理

    • 1.1 测试环境
    • 1.2 批量管理步骤
    • 1.3 批量分发管理实例
      • 1.3.1 利用sudo提权来实现没有权限的用户拷贝
      • 1.3.2 利用sudo提权开发管理脚本
      • 1.3.3 利用rsync来实现增量备份
    • 1.4 SSH批量管理分发脚本实战
    • 1.5 SSH批量管理总结
  • 2 非交互式expect
    • 2.1 非交互式生成密钥及实现批量管理
    • 2.2 一键批量安装httpd服务
    • 2.3 一键自动化50台规模集群网站

1 SSH批量分发管理

基于口令的,如何实现批量管理:expect、pssh、sshpass

期中架构分享

http://edu.51cto.com/course/course_id-4212.html

1.1 测试环境

m01(Server)

eth0:192.168.90.61/24 
eth1:172.16.1.61/24

nfs01(Client)

eth0:192.168.90.31/24 
eth1:172.16.1.31/24

backup(Client)

eth0:192.168.90.41/24 
eth1:172.16.1.41/24

web01(Client)

eth0:192.168.90.8/24 
eth1:172.16.1.8/24

1.2 批量管理步骤

1、创建用户及密码

2、m01创建密钥对

3、m01分发公钥

默认22端口可以不指定端口

若更改过的端口,需要指定-p端口

4、测试

测试成功的话连接后就不用密码了

[root@m01 ~]# useradd oldgirl
[root@m01 ~]# echo 123456|passwd --stdin oldgirl
更改用户 oldgirl 的密码 。
passwd: 所有的身份验证令牌已经成功更新。
[root@m01 ~]# id oldgirl
uid=501(oldgirl) gid=501(oldgirl) 组=501(oldgirl) [root@m01 ~]# su - oldgirl [oldgirl@m01 ~]$ ssh-keygen -t dsa Generating public/private dsa key pair. Enter file in which to save the key (/home/oldgirl/.ssh/id_dsa): Created directory '/home/oldgirl/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/oldgirl/.ssh/id_dsa. Your public key has been saved in /home/oldgirl/.ssh/id_dsa.pub. The key fingerprint is: bf:44:68:f3:eb:6b:03:28:45:21:24:fb:dd:e9:b0:cf oldgirl@m01 The key's randomart image is: +--[ DSA 1024]----+ | ..o .. | | o .. | | . . | | . ... o | | ..o.S . | | . .=.= | | .. ..+ | | o .oo | | Eo=o | +-----------------+ [oldgirl@m01 ~]$ ll .ssh/ 总用量 8 -rw------- 1 oldgirl oldgirl 668 2月 10 19:36 id_dsa #钥匙 -rw-r--r-- 1 oldgirl oldgirl 601 2月 10 19:36 id_dsa.pub #锁 #非交互式创建密钥 1、ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1 2、echo -e "\n" | ssh-keygen -t dsa -N "" #发送公钥(下面这个只能发送公钥) 没改端口:ssh-copy-id -i .ssh/id_dsa.pub oldgirl@x.x.x.x 改端口:ssh-copy-id -i .ssh/id_dsa.pub "-p 52113 oldgirl@x.x.x.x" #测试 [oldgirl@m01 ~]$ ssh -p 52113 oldgirl@172.16.1.31 /sbin/ifconfig eth0 [oldgirl@m01 ~]$ ssh oldgirl@172.16.1.8 /sbin/ifconfig eth0 [oldgirl@m01 ~]$ ssh oldgirl@172.16.1.41 /sbin/ifconfig eth0 #若要批量查看每个系统的版本,可以直接写成脚本,把上面的三条命令都写成脚本然后执行。 vi ssh.sh ssh -p 52113 oldgirl@172.16.1.31 /sbin/ifconfig eth0 ssh oldgirl@172.16.1.8 /sbin/ifconfig eth0 ssh oldgirl@172.16.1.41 /sbin/ifconfig eth0 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

1.3 批量分发管理实例

例:把所有服务器上的hosts解析文件给更新一遍,hosts文件内容如下

cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.1.5      lb01
172.16.1.6 lb02 172.16.1.7 web01 172.16.1.8 web02 172.16.1.51 db01 db01.etiantian.org 172.16.1.31 nfs01 172.16.1.41 backup 172.16.1.61 m01 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

企业里实现ssh的3种方案:

1、直接root ssh key。

条件:允许root ssh登录

2、利用sudo提权来实现没有权限的用户拷贝

3、利用suid来实现没有权限的用户拷贝(工作中不建议使用suid)

曲线救国的方式,可以先用scp把hosts文件拷贝到对方主机的家目录下,然后再给rsync或其它拷贝命令授权以suid(chmod u+s `which rsync`)。之后再用ssh连接执行远程拷贝功能(前提是rsync已经被授权suid)操作命令如下:

ssh -p 52113 hosts oldgirl@172.16.1.31:~ ssh -p 52113 oldgirl@172.16.1.31 /usr/bin/rsync ~/hosts /etc/hosts
  • 1
  • 2

1.3.1 利用sudo提权来实现没有权限的用户拷贝

指定一个用户,让他可以执行某个命令:

visudo
oldgirl ALL=(ALL) NOPASSWD:/usr/bin/rsync
  • 1
  • 2

自动化管理

echo "oldgirl   ALL=(ALL) NOPASSWD:/usr/bin/rsync" >>/etc/sudoers
visudo -c
  • 1
  • 2

实现远程sudo

两种方法: 
第一种:注释掉/etc/sudoers文件中的Defaults requiretty 
第二种(推荐):ssh 加-t选项,在执行远程ssh时可以打开终端,然后就可以sudo用了。

scp -P52113 hosts oldgirl@172.16.1.31:~ ssh -p52113 -t oldgirl@172.16.1.31 sudo /usr/bin/rsync ~/hosts /etc/hosts
  • 1
  • 2

1.3.2 利用sudo提权开发管理脚本

[oldgirl@m01 ~]$ cat fenfa_file.sh
scp -P52113 hosts oldgirl@172.16.1.31:~
ssh -p52113 -t oldgirl@172.16.1.31 sudo /usr/bin/rsync ~/hosts /etc/hosts
scp hosts oldgirl@172.16.1.41:~
ssh -t oldgirl@172.16.1.41 sudo /usr/bin/rsync ~/hosts /etc/hosts scp hosts oldgirl@172.16.1.8:~ ssh -t oldgirl@172.16.1.8 sudo /usr/bin/rsync ~/hosts /etc/hosts
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

1.3.3 利用rsync来实现增量备份

rsync -avz hosts -e 'ssh -p 52113' oldgirl@172.16.1.31:~
  • 1

#这样的方法有两种好处

1、增量 
2、加密

工作中的跳板机(堡垒机)一定要保护的很安全,就是批量管理的机器

1、防火墙

2、监听内网

3、不给外网IP

4、ssh防护好,禁止root登录

1.4 SSH批量管理分发脚本实战

所有服务器端ssh端口最好都一致

#一个简单的可以让所有服务器执行命令的脚本
[oldgirl@m01 scripts]$ cat ssh_view.sh
#!/bin/bash
. /etc/init.d/functionsexport PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/oldgirl/binif [ $# -ne 1 ];then echo "USAGE:$0 ARG" exit 1 fi #由于我的端口没有一致,故只测试31这一个改过端口的服务器 for n in 31 do echo =============172.16.1.$n============= ssh -p52113 oldgirl@172.16.1.$n "$1" done #######测试 [oldgirl@m01 scripts]$ bash ssh_view.sh "cat /etc/redhat-release" =============172.16.1.31============= CentOS release 6.9 (Final) [oldgirl@m01 scripts]$ bash ssh_view.sh "tail -1 /etc/inittab" =============172.16.1.31============= id:3:initdefault: #可以批量管理服务器的拷贝文件的脚本 [oldgirl@m01 scripts]$ cat fenfa_file1.sh #!/bin/bash . /etc/init.d/functions if [ $# -ne 2 ];then echo "USAGE:$0 ARG1 ARG2" exit 1 fi for n in 8 41 31 do scp ~/$1 oldgirl@172.16.1.${n}:~ >/dev/null 2>&1 &&\ #备份,可以不做 #ssh -t oldgirl@172.16.1.${n} sudo /usr/bin/rsync /etc/hosts /etc/hosts_$(date +%F-%H:%M:%S) ssh -t oldgirl@172.16.1.${n} sudo /usr/bin/rsync ~/$1 $2 >/dev/null 2>&1 if [ $? -eq 0 ];then action "fenfa hosts 172.16.1.$n" /bin/true else action "fenfa hosts 172.16.$n" /bin/false fi done 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

1.5 SSH批量管理总结

1、利用root做ssh key验证。

优点:简单,易用

缺点:安全差,同时无法禁止root远程连接这个功能

企业应用:80%的中小企业。

2、利用普通用户如oldgirl来做

思路是先把分发的文件拷贝到服务器用户家目录,然后sudo提权拷贝分发的文件到远程服务器的对应权限目录。

优点:安全。无需停止root远程连接这个功能。

缺点:配置比较复杂。

3、拓展:同方案2,只是不用sudo,而是设置suid对固定命令提权。

优点:相对安全

缺点:负载,安全性较差。任何人都可以处理带有suid权限的命令。

建议:

  1. 追求简单可以选1

  2. 追求安全建议选2

  3. 有能力可以用puppet、saltstack。

  4. suid:普通用户裕兴程序,没有权限时也可以suid,然后运行,必须是编译好的程序命令。

puppet:早起大网站使用的

saltstack(*):可以装客户端

ansible(*):优点:不用装客户端,直接ssh就可以

4、企业级生产场景批量管理,自动化管理方案:

1)最简单常用ssh key,功能最强大的。一般中小型企业会用,50-100台以下。

2)sina cfengine、puppet 较早的批量管理工具。现在基本上没有企业用。

3)门户级别比较流行的,puppet批量管理工具,复杂,笨重。

4)saltstack批量管理工具,特点:简单,功能强大(配置复杂),赶集网、小米等一些CDN公司会使用

5)http+cron

批量管理路线:ssh key–>cfengine–>puppet–>saltstack/ansible

轻松实现远程批量拷贝文件脚本博客:

http://blog.51cto.com/oldboy/1205715

SSH连接慢的解决:

http://blog.51cto.com/oldboy/1300964

2 非交互式expect

非交互式工具:expect(一门语言)、sshpass、pssh

expect:默认没有安装,需要先安装再使用

[root@m01 ~]# yum install expect -y
[root@m01 ~]# rpm -qa expect
expect-5.44.1.15-5.el6_4.x86_64 #装完expect后会附带一个随机密码生成工具mkpasswd [root@m01 ~]# mkpasswd tnhu1LM9$ [root@m01 ~]# mkpasswd Y1]taHax9 [root@m01 ~]# mkpasswd -l 10 #-l 指定随机密码长度 GSg[yeyv10 [root@m01 ~]# mkpasswd -l 15 nb/Wayrtj9ww0vE 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

2.1 非交互式生成密钥及实现批量管理

1、所有机器创建用户及密码
useradd oldgirl888
echo 123456|passwd --stdin oldgirl
id oldgirl888
su - oldgirl888
2、管理机创建密钥
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1 3、自动分发密钥 vim fenfa_sshkey.exp #!/usr/bin/expect # if { $argc != 2 } { send_user "Usage: expect fenfa_sshkey.exp file host \n" exit } #define var set file [lindex $argv 0] set host [lindex $argv 1] set password "123456" spawn ssh-copy-id -i $file oldboy@$host expect { "yes/no" {send "yes\r";exp_continue} "*password" {send "$password\r"} } expect eof exit -onexit { send_user "Oldboy say goodbye to you!\n" } [oldboy@m01 scripts]$ expect fenfa_sshkey.exp ../.ssh/id_dsa.pub 172.16.1.41 一个脚本都分发: cat /server/scripts/fenfa_sshkey.sh #!/bin/bash # . /etc/init.d/functions for i in 128 129 do expect fenfa_sshkey.exp ~/.ssh/id_dsa.pub 192.168.90.$i >/dev/null 2>&1 if [ $? -eq 0 ] then action "$i" /bin/true else action "$i" /bin/false fi done 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

2.2 一键批量安装httpd服务

1、准备工作:
useradd oldboy
echo 123456|passwd --stdin oldboy
id oldboy
2、sudo提权实现没有权限用户拷贝 配置sudoers: echo "oldboy ALL=(ALL) NOPASSWD: ALL" >>/etc/sudoers visudo -c su - oldboy 自动分发脚本 [oldboy@m01 scripts]$ cat sshkey_install.sh #!/bin/bash # . /etc/init.d/functions export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin # Product key pair ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa > /dev/null 2>&1 if [ $? -eq 0 ];then action "Create dsa $ip" /bin/true else action "Create dsa $ip" /bin/false exit 1 fi #dis pub key for i in 128 129 do expect ~/scripts/fenfa_sshkey.exp ~/.ssh/id_dsa.pub 192.168.90.$i >/dev/null 2>&1 if [ $? -eq 0 ];then action "$i" /bin/true else action "$i" /bin/false fi done #dis fenfa scripts for n in 128 129 do scp -rp ~/scripts oldboy@192.168.90.$n:~ done #install service for m in 128 129 do ssh -t oldboy@192.168.90.$m sudo /bin/bash ~/scripts/install.sh done cat /scripts/install.sh yum install httpd -y 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

2.3 一键自动化50台规模集群网站

思路: 
自动化的基础:

a.搭建yum仓库 
b.定制rpm包

1、ssh key + expect

a.kickstart无人值守安装Linux系统(自动创建用户、密码、优化) 
b.分发机上创建密钥对、批量发走公钥(expect) 
c.写安装优化脚本、批量发到各个服务器上,远程执行安装

2、高级架构师知识搞定的一套集群方案

a.cobbler无人值守安装Linux系统(自动创建用户、密码、优化、salt客户端) 
b.服务端salt上,创建认证,写配置来批量安装管理各个节点服务器应用。

3、高级架构师知识搞定的一套集群方案

a.kvm虚拟化、根据不同的业务提前做好镜像 
b.通过与计算工具OpenStack管理镜像,批量生成五个虚拟机 
c.服务端salt上,创建认证,写配置来批量安装管理各个节点服务器应用。

4、docker

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Mr_rsq/article/details/79619793

转载于:https://www.cnblogs.com/liujiacai/p/8684555.html

(转)SSH批量分发管理非交互式expect相关推荐

  1. 第三十天-ssh key企业批量分发自动化管理案例

    本文实现一个应用ssh key 批量分发案例 目录 一.ssh key 原理及案例原理简图 1.ssh key 简介 2.rsa和dsa区别 3.ssh-copy-id的特殊应用 4.ssh-copy ...

  2. ssh 免密登录_技术漫谈 |非交互式大规模主机群信任登录认证及其容器化实现

    原创作者: 清如许 导 读 阅读本文您将了解到:配置免密信任登录会极大地便利Ansible/Breeze 工具管理主机群:应用非交互式方法安全便捷地建立主机间 SSH 信任登录关系:应用多并发技术快速 ...

  3. linux ssh非交互脚本,Linux expect非交互式执行脚本

    expect简介 expect是一款自动化的脚本解释型的工具. expect基于tcl脚本,expect脚本的运行需要tcl的支持. expect对一些需要交互输入的命令很有帮助,比如ssh ftp ...

  4. ssh密钥分发之二:使用sshpass配合ssh-kopy-id编写脚本批量分发密钥:

    使用sshpass配合ssh-kopy-id编写脚本批量分发密钥:首先sshpass是一个ssh连接时的免交互工具,首先要安装一下: yum install sshpass -y接下来我们就可以使用s ...

  5. 批量管理服务器,批量分发文件

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://navyaijm.blog.51cto.com/4647068/835309 一. ...

  6. 【SSH项目实战】脚本密钥的批量分发与执行【转】

    [TOC] 前言 <项目实战>系列为<linux实战教学笔记>第二阶段内容的同步教学配套实战练习,每个项目循序衔接最终将组成<Linux实战教学笔记>第二阶段核心教 ...

  7. linux非交互式脚本,Linux expect非交互式执行脚本

    expect简介 expect是一款自动化的脚本解释型的工具. expect基于tcl脚本,expect脚本的运行需要tcl的支持. expect对一些需要交互输入的命令很有帮助,比如ssh ftp ...

  8. linux批量分发必会面试题,通过邮件反馈结果。

    请准备三台linux机器为别为A,B,C,要求实现以下内容 1.用自己的名字用户完成一把钥匙开多把锁(A,钥匙,B,C锁)的免密码登录部署场景 该题在生产环境中的用途为:批量分发数据,批量发布程序代码 ...

  9. ssh密钥分发与ansible

    笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 当我们公司的服务器达到几十台或几百台或更高的时候,利用批量管理工具管理系统是我们要做的 常用的批量管理工具有ans ...

最新文章

  1. Objective-C非正式协议与正式协议
  2. 如何查看,当运行一个hibernate 方法后到底执行了哪些SQL语句
  3. 物联网设计四大独特挑战的解决方案
  4. 树莓派该文件名_树莓派学习笔记(2):常用linux命令
  5. ADO.NET入门教程(一) 初识ADO.NET
  6. 在ABAP XSLT中调用ABAP类的方法
  7. 使用SVN提示“工作副本已经锁定”的解决办法
  8. 【.NET Core项目实战-统一认证平台】第十三章 授权篇-如何强制有效令牌过期
  9. linux增加调整虚拟内存
  10. 《SuperMap GIS二次开发MVC实战训练---江海区慢性病防治院系统》项目研发阶段性总结
  11. 链表的代码实现【数据结构F】
  12. Linux磁盘及文件系统(二)Linux下磁盘命名和分区
  13. Python自动化测试问题及处理方法(一)
  14. JS-面向对象-对象的特性-禁止对象扩展 / 对象的特性-封印对象 / 对象的特性-冻结对象
  15. android textview 添加阴影效果:Paint.setShadowLayer is not supported
  16. 三、JAVA流程控制(选择结构if、while、for、switch)
  17. HTML/CSS 常见面试题汇总
  18. 用Python爬取QQ空间说说和相册!还不让我访问!
  19. Air Keyboard
  20. 行列式的六条运算法则整理

热门文章

  1. vmware虚拟机移植带来的问题
  2. 设计模式(结构型模式)——桥接模式(Bridge)
  3. 移动端开发高清效果和多屏适配
  4. ASP.NET夜话笔记06
  5. rhel6.2 yum
  6. Alex学Ruby[详解 block和Proc对象]
  7. rocketmq还要eventbus_ListEventBuses_ListEventBuses_事件总线_C# SDK_阿里云SDK参考_事件总线EventBridge - 阿里云...
  8. 计算机专业英语已经出版,欢迎关注
  9. Python主要智能优化算法库汇总
  10. Apache Ignite与Apache Hive的个人理解与总结