(转)SSH批量分发管理&非交互式expect
目录
1 SSH批量分发管理
基于口令的,如何实现批量管理:expect、pssh、sshpass
期中架构分享
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/functions
export PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/oldgirl/bin
if [ $# -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
追求安全建议选2
有能力可以用puppet、saltstack。
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
轻松实现远程批量拷贝文件脚本博客:
SSH连接慢的解决:
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
(转)SSH批量分发管理&非交互式expect的更多相关文章
- (转)Linux SSH批量分发管理
Linux SSH批量分发管理 原文:http://blog.51cto.com/chenfage/1831166 第1章 SSH服务基础介绍 1.1 SSH服务 1.1.1SSH介绍 SSH是Sec ...
- SSH批量分发管理
ssh服务认证类型主要有两个: 基于口令的安全验证: 基于口令的安全验证的方式就是大家一直在用的,只要知道服务器的ssh连接账户.口令.IP及开发的端口,默认22,就可以通过ssh客户端登陆到这台远程 ...
- SSH认证原理和批量分发管理
SSH密码认证原理 几点说明: 1.服务端/etc/ssh目录下有三对公钥私钥: [root@m01 ssh]# ls moduli ssh_config sshd_config ssh_host_d ...
- Linux使用ssh公钥实现免批量分发管理服务器
ssh 无密码登录要使用公钥与私钥.linux下可以用用ssh-keygen生成公钥/私钥对,下面我以CentOS为例. 管理机器外网IP10.0.0.61(内网172.16.1.61) 服务器外网1 ...
- ssh key 免密码登陆服务器,批量分发管理以及挂载远程目录的sshfs
ssh key 免密码登陆服务器,批量分发管理以及挂载远程目录的sshfs 第一部分:使用ssh key 实现服务器间的免密码交互登陆 步骤1: 安装openssh-clients [root@001 ...
- [svc]ssh批量分发key/批量用户管理
centos6 sshpass批量分发key yum install sshpass -y ssh-keygen -t dsa -f ~/.ssh/id_dsa -P "" 命令说 ...
- SSH-KEY服务及批量分发与管理实战
SSH服务 一.SSH服务介绍 SSH是Secure Shell Protocol的简写,由IETF网络工作小组制定:在进行数据传输之前,SSH先对联机数据包通过加密技术进行加密处理,加密后再进行数据 ...
- SSH批量管理 expect自动交互
SSH批量管理 expect自动交互 原创博文http://www.cnblogs.com/elvi/p/7662908.html # SSH批量管理 # expect自动交互 ########### ...
- ssh密钥批量分发
#################以下所有的命令脚本都是在centos7系统上实现,centos6略有不同 客户端使用公钥连接服务器的步骤: 提起ssh我们就能想到的是远程连接,平时我们都是通过密码来 ...
随机推荐
- wpf 依赖属性注册解释
这个解释的很明白了 http://www.cnblogs.com/xiongpq/archive/2010/06/29/1767905.html
- 解决Eclipse+ADT连接夜神模拟器失败问题
问题1: 运行夜神模拟器,cmd执行 adb devices不显示 答案1: 原因可能是夜神模拟器的adb版本与sdk下的adb版本不一致,拷贝sdk下的adb.exe并改名为nox_adb.exe替 ...
- XE下的FMX中压缩图片
用FMX压缩图片,发现FMX里的canvas没有draw,stretch,cliprect类,FMX里程序创建时会自动引用FMX.Graphics, 而这个单元内的TBitmap类的Canvas没有S ...
- web端访问文件没有权限的问题
背景 : ftp的PHP项目中的某些文件没有写入的权限..系统报注意错误!!! 原因 : 一般情况下,web端访问网站一般使用的是WWW权限(有限制的权限组)去访问, 但是我们编程开发的时候, 有可能 ...
- [SinGuLaRiTy] 复习模板-数据结构
[SinGuLaRiTy-1040] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 二维线段树 2D_Segment_Tree //示例:单 ...
- django日期查询出现UTC日志转换CONVERT_TZ出错的问题
select CONVERT_TZ(NOW(), 'UTC', 'UTC') 出现NULL值, 原因是MySQL少了时区表: SELECT * FROM mysql.time_zone; SELECT ...
- .NET Core 版本不支持的问题
分析一个.NET Core开源项目(Ocelot),打开后发现提示当前版本.NET Core 不支持. 错误信息如下: The current .NET SDK does not support ta ...
- [golang] go的typeswitch guard(类型区别)语法和type assertion(类型断言)语法
最近在实现golang,看到个go的特性语法: typeswitch guard. typeswitch guard语法如下: package main import "fmt" ...
- jquery循环语句if-else if-else
jquery循环语句if-else if-elsecallbackFun()函数,开始是写的if-if-else.结果是不管第一个if有没有匹配到,会再次判断, 如果匹配到第二个if,则第二个if中的 ...
- mysql 查询月份数据.
//查看本月数据 SELECT *FROMcontent_publishWHEREdate_format(publish_time, '%Y %m') = date_format(DATE_SUB(c ...