(转)Linux SSH批量分发管理

Linux SSH批量分发管理

原文:http://blog.51cto.com/chenfage/1831166

第1章 SSH服务基础介绍

1.1 SSH服务

1.1.1SSH介绍

SSH是Secure Shell Protocol的简写,由IETF网络工作小组制定;在进行数据传输之前,SSH先对联机数据包通过加密技术进行加密处理,加密后再进行数据传输。

SSH是专为远程登录会话和其他网络服务提供的安全性协议,利用SSH协议可以有效的防止远程管理过程中的信息泄露问题,比telnet安全。

SSH服务主要提供两个服务功能:

(1)     类似telnet远程联机服务器的服务,即SSH服务。

(2)     类似FTP服务的sftp-server,借助SSH协议来传输数据的,提供更安全的SFTP服务。

SSH客户端还包含一个很有用的远程安全拷贝命令:scp

 

知识小结:

(1)     SSH是安全的加密协议,用于远程连接Linux服务器。

(2)     SSH默认端口是22,有两个版本:SSH1与SSH2。

(3)     SSH服务端主要包含两个服务功能:SSH远程连接与SFTP服务。

(4)     Linux SSH客户端包含ssh远程连接命令,以及远程拷贝scp命令等。

1.1.2SSH相关软件

[root@m01 ~]# rpm -qa openssh openssl #<==与SSH服务相关的两个软件

openssh-5.3p1-111.el6.x86_64     #<==提供远程连接服务

openssl-1.0.1e-42.el6.x86_64     #<==提供加密服务

 

/etc/ssh/ssh_config            #<==SSH客户端配置文件

/etc/ssh/sshd_config         #<==SSH服务端配置文件

1.1.3查看SSH服务

[root@m01 ~]# /etc/init.d/sshd status    #<==查看ssh服务的运行状态

openssh-daemon (pid  1273) 正在运行...

[root@m01 ~]# netstat -tunlp |grep -w"22" #<==对外侦听的端口是tcp:22

tcp       0      0 0.0.0.0:22       0.0.0.0:*        LISTEN      1273/sshd          

tcp       0      0 :::22            :::*            LISTEN      1273/sshd          

[root@m01 ~]# ps -ef |grep sshd       #<==查看进程

root      1273      1  0 23:04 ?        00:00:00 /usr/sbin/sshd

root      1430   1273  0 23:37 ?        00:00:00 sshd: root@pts/0

root      1478   1432  0 23:47 pts/0    00:00:00 grep --color=auto sshd

[root@m01 ~]# lsof -i tcp:22          #<==对外侦听的端口是tcp:22

COMMAND  PIDUSER   FD   TYPE DEVICE SIZE/OFF NODE NAME

sshd    1273root    3u  IPv4 10360      0t0  TCP *:ssh (LISTEN)

sshd    1273 root   4u  IPv6  10362     0t0  TCP *:ssh (LISTEN)

sshd    1430root    3r  IPv4 11455      0t0  TCP 10.0.0.61:ssh->10.0.0.1:50158(ESTABLISHED)

 

1.2 SSH1.X的联机过程

过程如下:

(1)     服务端先产生768字节的公钥

(2)     客户端主动发起请求

(3)     服务端将公钥发给客户端,客户端利用公钥计算机出独一无二的私钥,并将两者整合成密钥对(pair),再发送给服务端

(4)     之后,客户与服务端就利用这独一无二的密钥对,来相互交流

                             

[root@m01 ~]# grep Protocol /etc/ssh/sshd_config  #<==协议为2

Protocol 2

[root@m01 ~]# grep ServerKey /etc/ssh/sshd_config #<==公钥长度

#ServerKeyBits 1024

 

1.2.1客户端第1次连接服务端

[root@s1 ~]# ssh 10.0.0.61    #<==客户端第一次连接服务端时,没有服务端的公钥

The authenticity of host '10.0.0.61 (10.0.0.61)'can't be established.

RSA key fingerprint is6d:5c:ed:4e:74:5b:ad:0f:52:94:26:b5:44:57:1f:8f.

Are you sure you want to continue connecting(yes/no)?  #<==所以会弹出这个对话框,我们要在这里输入yes,再输入服务端的密码。

Warning: Permanently added '10.0.0.61' (RSA) tothe list of known hosts.

root@10.0.0.61's password: xxxxxx             #<==输入服务端的密码

Last login: Wed Jul 27 00:00:38 2016 from 10.0.0.1

[root@m01 ~]#                    #<==远程登录成功

~在客户端查看服务端的公钥,最好再克隆一个窗口

[root@s1 ~]# ls ~/.ssh/                    #<==服务端公钥的存放位置

known_hosts                  #<==只要客户端连接过服务端,就会产生这个文件

[root@s1 ~]# cat ~/.ssh/known_hosts  #<==查看服务端公钥的内容

10.0.0.61 ssh-rsaAAAAB3NzaC1yc2EAAAABIwAAAQEAyNNGcTUQeoCPw+Inhd6M3KicWQuftqNfjtMOxWJBPvvP8s4zmiqLbfa5ZGLOtaVSgPBPN5Lslzy1jYlyXJAM9dHhd+yCwJ33ZaFw+y8K7uaipBMdRwcJ5N92rkV2DZagCAytqptvfnyj/aUFmVeAF6g99XrLgWuZUQ2Nk51b8NSgkbtRGSlR4e0z2RBSP1RE2vza5ZfW06dyRbZy4VDSc6aA5IpReECVlqAmIqcNdXD+ak73FXdHLzcBf6DYPXiHFUWs23YCaLPI6q6qFQyu7kLU6qXB3H5LzNfNJRj6qJgHeqUt4b15GGDag4B5jZYV87bvjWprgWwPIseNRtuBFQ=

1.2.2客户端第2次连接服务端

[root@s1 ~]# ssh 10.0.0.61     #<==再次远程登录服务端

root@10.0.0.61's password:xxxxxx  #<==直接提示输入服务端的密码

                                                                      #<==因为已经有服务端的公钥了

Last login: Wed Jul 27 00:20:45 2016 from 10.0.0.1

1.2.3SSH2.X的联机过程

SSH2.x多加了一个确认联机正确性的Diffle-Hellman机制。

 

1.3 SSH服务认证类型

有两种,分别是:

r 基于口令的安全验证

r 基于密钥的安全验证

1.3.1基于口令的安全验证

[root@s1 ~]# ssh 10.0.0.61     #<==远程连接到服务器上

root@10.0.0.61's password:      #<==输入服务端的密码

Last login: Wed Jul 27 00:31:34 2016 from 10.0.0.1

[root@m01 ~]# logout          #<==注销

Connection to 10.0.0.61 closed.

[root@s1 ~]#

1.3.2基于密钥的安全验证

需要依靠密钥,必须事先建立一对密钥对,然后把公钥放在需要访问的目标服务器上,把私钥放到SSH客户端上。

简单记忆,公钥(id_dsa.pub)是锁,私钥(id_dsa)是钥匙,只有钥匙才能开锁。

 

1.4 更改SSH默认登录配置

更改前,先备份,只需要更改5个地方。

[root@m01 ~]# \cp /etc/ssh/sshd_config{,.ori}  #<==更改前,先备份

[root@m01 ~]# vim /etc/ssh/sshd_config       #<==修改配置文件

13 Port 52113                      #<==对外监听的端口

15 ListenAddress172.16.1.61:52113          #<==只在本机的内网口侦听ssh服务,端口52113

42 PermitRootLoginno                   #<==不允许root用户登录

65 PermitEmptyPasswords no            #<==不允许空密码登录

80 GSSAPIAuthentication no            #<==解决连接慢的问题   

122 UseDNS no                  #<==不使用DNS做反向解析

[root@m01 ~]# /etc/init.d/sshd reload      #<==平滑重启

重新载入 sshd:                      [确定]

 

1.4.1一键修改SSH的配置文件

\cp /etc/ssh/sshd_config{,.ori}

sed -ir '13 iPort 52113\nPermitRootLoginno\nPermitEmptyPasswords no\nGSSAPIAuthentication no\nUseDNS no' /etc/ssh/sshd_config

/etc/init.d/sshd reload

 

1.4.2牦牛阵法

所有的服务器都不能被ssh连接管理,只有管理服务器能从内网卡连接到所有的服务器来管理。外网可以通过vpn拨号来管理,外网口全部不允许被连接管理,这样做是为了安全。

 

1.4.3验证

[root@s1 ~]# ssh -p52113 oldboy@172.16.1.61  #<==指定端口,指定用户名

oldboy@172.16.1.61's password: xxxxxx      #<==输入oldboy的密码

[oldboy@m01 ~]$ hostname               #<==连接成功

m01

[oldboy@m01 ~]$ whoami                #<==查看用户

oldboy

[oldboy@m01 ~]$ sudo su -           #<==通过sudo切换到root用户来管理

[root@m01 ~]# whoami

root

注意:windows 客户端利用Secure CRT连接时,用户名和端口也要修改!

r 用户名:oldboy

r 端口:52113

 

1.4.4如何防止SSH登录入侵小结

(1)     用密钥登录,不用密码登陆

(2)     牦牛阵法:解决SSH安全问题

r 防火墙封闭SSH,指定源IP限制

r 开启SSH只监听本地内网IP(ListenAddress 172.16.1.61:52113)

(3)     尽量不给服务器外网IP

 

1.5 SSH命令详解

1.5.1SSH命令用法

ssh -p52113 oldboy@172.16.1.61 [ 命令 ]

ssh:固定命令

-p:指定端口

oldboy:服务端的用户名,以什么身份连接服务端

@:分隔符

172.16.1.61:服务端的内网IP

[ 命令 ]:连接到远程服务器,执行命令;但不登录到远程服务器

1.5.1.1 直接连接远程服务器

[root@s1 ~]# ssh -p52113 oldboy@172.16.1.61

oldboy@172.16.1.61's password:

Last login: Wed Jul 27 13:31:13 2016 from 10.0.0.1

[oldboy@m01 ~]$ exit

1.5.1.2 连接远程服务器执行命令

[root@s1 ~]# ssh -p52113 oldboy@172.16.1.61/sbin/ifconfig eth0

oldboy@172.16.1.61's password:

eth0     Link encap:Ethernet  HWaddr00:0C:29:FD:28:FD 

         inet addr:10.0.0.61  Bcast:10.0.0.255  Mask:255.255.255.0

         inet6 addr: fe80::20c:29ff:fefd:28fd/64 Scope:Link

          UPBROADCAST RUNNING MULTICAST MTU:1500  Metric:1

          RXpackets:3574 errors:0 dropped:0 overruns:0 frame:0

          TXpackets:2443 errors:0 dropped:0 overruns:0 carrier:0

         collisions:0 txqueuelen:1000

          RXbytes:329346 (321.6 KiB)  TX bytes:443310(432.9 KiB)

1.5.2scp命令

scp - secure copy (remote file copy program)

每次都是全量拷贝,增量拷贝用rsync。

可以推(push,本地文件在前)和拉(pull,远端文件在前)。

 

1.5.2.1 参数

-P:指定端口

-r:递归复制目录

-p:复制目录时,保持属性

-l:限速Kbit/s

 

1.5.2.2 Push(推)

~客户端将hosts文件复制到服务端

[root@s1 ~]# scp -P52113 /etc/hostsoldboy@172.16.1.61:/tmp

oldboy@172.16.1.61's password:

hosts

[root@m01 ~]# ls /tmp/     #<==服务端验证

hosts

~客户端将/etc目录复制到服务端的/tmp下

[root@s1 ~]# scp -P52113 -rp /etcoldboy@172.16.1.61:/tmp

[root@m01 ~]# ll -d /tmp/etc/  #<==服务端验证

drwxr-xr-x 90 oldboy oldboy 4096 2016-07-26 20:32/tmp/etc/

 

1.5.2.3 Pull(拉)

~客户端将服务端的/tmp/etc目录复制到客户端的/data下

[root@s1 ~]# scp -P52113 -rpoldboy@172.16.1.61:/tmp/etc /data

[root@s1 ~]# ll -d /data/etc/

drwxr-xr-x 90 root root 4096 2016-07-26 20:32/data/etc/

 

1.5.2.4 scp知识小结

(1)     scp是加密的远程copy,而cp仅为本地copy。

(2)     可以把数据从一台机器送到另一台机器,也可以从其它服务把数据回到本地执行命令的服务器。

(3)     每次都是全量完整copy,因此,效率不高,适合第一次copy用,如果需要增量copy,用rsync。

 

1.5.3sftp命令(几乎不用!)

这个工具比较危险!不支持上传目录。

windows客户端和linux服务器之间传输数据工具:

(1)     rz、sz(lrzsz)

(2)     winscp WinSCP-v4.0.5

(3)     SFX(xshell)

(4)     SFTP                       #<==基于ssh加密传输

(5)     samba、http、ftp、nfs

[root@s1 ~]# sftp -oPort=52113 oldboy@172.16.1.61  #<==s1是客户端

Connecting to 172.16.1.61...

oldboy@172.16.1.61's password:

sftp> pwd                            #<==查看当前目录,是当前连接用户的家目录

Remote working directory: /home/oldboy

sftp> put /etc/hosts        #<==上传文件

Uploading /etc/hosts to /home/oldboy/hosts /etc/hosts  100% 330  0.3KB/s   00:00   

sftp> put /etc/hosts /tmp      #<==上传文件到指定目录下

Uploading /etc/hosts to /tmp/hosts /etc/hosts     100% 330   0.3KB/s  00:00   

sftp> cd /tmp          #<==也可以切换路径

sftp> pwd

Remote working directory: /tmp

sftp> ls             #<==也可以查看当前目录的内容

etc    hosts

sftp> get hosts          #<==下载文件

sftp> get hosts /home       #<==下载文件到指定目录下

1.6 报错集

1.6.1Connection refused

(1)     有可能是防火墙阻挡

(2)     有可能端口改变了

(3)     有可能对端服务没开

[root@s1 ~]# ssh -p22 oldboy@172.16.1.61/sbin/ifconfig eth0    

ssh: connect to host 172.16.1.61 port 22: Connection refused

1.6.2no route to host

可能是防火墙影响了

 

1.7 章节重点小结

(1)     ssh为加密的远程连接协议,相关软件有:openssh、openssl

(2)     默认端口是22

(3)     版本有1.x和2.x

(4)     服务端远程连接服务:sftp服务、sshd守护进程

(5)     客户端:ssh、scp、sftp命令

(6)     安全验证方式:口令和密钥

(7)     服务安全优化:修改默认端口22,禁止root远程连接和dns反向解析,ssh听监听内网IP

(8)     密钥对:公钥(id_dsa.pub)在服务端(锁头),私钥(id_dsa)在客户端(钥匙)

 

 

 

 

 

 

第2章 SSH批量管理分发项目实战

基于口令的安全验证:

如何实现批量管理:expect、pssh、sshpass。

基于密钥的安全验证:

需要依靠密钥,必须事先建立一对密钥对,然后把公钥放在需要访问的目标服务器上,把私钥放到SSH客户端上。

公钥(id_dsa.pub)是锁(服务端),私钥(id_dsa)是钥匙(客户端),只有钥匙才能开锁。

2.1 实战环境

2.2 拓扑图

 

2.3 操作步骤

2.3.1所有机器创建用户及密码

所有的密钥都是基于用户的!用户统一用oldgirl。

useradd oldgirl

echo 123456|passwd --stdin oldgirl

id oldgirl

su - oldgirl

2.3.2m01创建密钥对

ssh-keygen -t dsa       #<==手动生成,一路向北

ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa>/dev/null 2>&1

echo -e "\n"|ssh-keygen -t dsa -N""

#<==非交互式创建密钥(两种),推荐要第一种

~操作过程

[oldgirl@m01 ~]$ ssh-keygen -t dsa     #<==-t指定dsa加密算法,一路回车

Generating public/private dsa key pair.   #<==产生dsa密钥对

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:                                #<==指纹

81:a2:0b:80:27:e3:f3:14:dc:bb:3e:c8:54:a5:e7:beoldgirl@m01

The key's randomart image is:

+--[ DSA 1024]----+

|                |

|. . . o         |

|= .o..+ .       |

|o+ ..+.. .      |

|.o....o S       |

| .+o ..         |

| +....          |

|   o...         |

|    ..E.        |

+-----------------+

[oldgirl@m01 ~]$ ll ~/.ssh/                   #<==查看密钥对

总用量 8

-rw------- 1 oldgirl oldgirl 668 2016-07-27 16:30id_dsa      #<==私钥(钥匙)

-rw-r--r-- 1 oldgirl oldgirl 601 2016-07-27 16:30id_dsa.pub   #<==公钥(锁)

 

2.3.3先优化sshd的配置文件

所有服务器都执行以下的命令。

\cp /etc/ssh/sshd_config{,.ori}

sed -ir '13 iPort 52113\nPermitRootLoginno\nPermitEmptyPasswords no\nGSSAPIAuthentication no\nUseDNS no'/etc/ssh/sshd_config

/etc/init.d/sshd reload

 

2.3.4m01分发公钥

ssh-copy-id -i ~/.ssh/id_dsa.puboldgirl@172.16.1.41

#<==默认端口

ssh-copy-id -i ~/.ssh/id_dsa.pub "-p 52113 oldgirl@172.16.1.31"

#<==更改过的端口

操作过程如下:

~默认22端口

[oldgirl@m01 ~]$ ssh-copy-id -i ~/.ssh/id_dsa.puboldgirl@172.16.1.41

[oldgirl@backup ~]$ ll ./.ssh/               #<==在172.16.1.41上验证

总用量 4

-rw------- 1 oldgirl oldgirl 601 2016-07-27 16:53 authorized_keys   #<==公钥名被改了

[root@backup .ssh]# grep authorized_keys/etc/ssh/sshd_config

#AuthorizedKeysFile     .ssh/authorized_keys  #<==因为默认配置文件里有指定了

~更改过的端口:52113

[oldgirl@m01 ~]$ ssh-copy-id -i ~/.ssh/id_dsa.pub"-p 52113 oldgirl@172.16.1.31"

[oldgirl@nfs01 ~]$ ll .ssh/              #<==在172.16.1.31上验证

总用量 4

-rw------- 1 oldgirl oldgirl 601 2016-07-27 17:05 authorized_keys   #<==公钥名被改了

[root@nfs01 ~]# grep authorized_keys/etc/ssh/sshd_config

#AuthorizedKeysFile     .ssh/authorized_keys #<==因为默认配置文件里有指定了

2.3.5测试

连接所有的机器,不提示密码可以直接操作,这是成功的标志!

[oldgirl@m01 ~]$ ssh -p52113 oldgirl@172.16.1.8/sbin/ifconfig eth0

[oldgirl@m01 ~]$ ssh -p52113 oldgirl@172.16.1.31/sbin/ifconfig eth0

[oldgirl@m01 ~]$ ssh -p52113 oldgirl@172.16.1.41/sbin/ifconfig eth0

2.3.6批量管理脚本(执行命令)

[oldgirl@m01 ~]$ mkdir server/scripts -p

cd server/scripts/

cat >>view_ip.sh<<EOF

#!/bin/sh

ssh -p52113 oldgirl@172.16.1.8 /sbin/ifconfig eth0

ssh -p52113 oldgirl@172.16.1.31 /sbin/ifconfigeth0

ssh -p52113 oldgirl@172.16.1.41 /sbin/ifconfigeth0

EOF

sh view_ip.sh

 

2.3.7优化脚本※※※※※

[oldgirl@m01 scripts]$ cp view_ip.sh{,.ori}

[oldgirl@m01 scripts]$ cat view_ip.sh

#!/bin/sh

. /etc/init.d/functions#<==调用系统函数库

 

if [ $# -ne 1 ];then#<==传参的个数如果不等于1

  echo"USAGE:/bin/sh $0 ARG"#<==打印帮助信息

  exit#<==并退出,让用户再次输入

fi

 

for n in 8 31 41

do

  echo=========172.16.8.$n=========

  ssh-p52113 oldgirl@172.16.1.$n "$1"#<==$1代表第1个参数

done

~验证

[oldgirl@m01 scripts]$ sh view_ip.sh  #<==必须要加一个参数,否则报错

USAGE:/bin/sh view_ip.sh ARG

[oldgirl@m01 scripts]$ sh view_ip.sh "cat/etc/redhat-release"

#<==后面的参数,用双引号引起来

=========172.16.8.8=========

CentOS release 6.7 (Final)

=========172.16.8.31=========

CentOS release 6.7 (Final)

=========172.16.8.41=========

CentOS release 6.7 (Final)

 

[oldgirl@m01 scripts]$ sh view_ip.sh"/sbin/ip a |grep eth1"  #<==超级强大!

=========172.16.8.8=========

3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP>mtu 1500 qdisc pfifo_fast state UP qlen 1000

    inet172.16.1.8/24 brd 172.16.1.255 scope global eth1

=========172.16.8.31=========

3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP>mtu 1500 qdisc pfifo_fast state UP qlen 1000

    inet172.16.1.31/24 brd 172.16.1.255 scope global eth1

=========172.16.8.41=========

3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP>mtu 1500 qdisc pfifo_fast state UP qlen 1000

    inet172.16.1.41/24 brd 172.16.1.255 scope global eth1

2.4 实现提权多种解决方案实践

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

2.4.1直接root用户分发sshkey

      条件:允许root用户ssh登录。

2.4.2利用suid实现没有权限用户拷贝(只做了解!)

一个命令如果设置了suid,那么任何用户执行这个命令,就会有与这个命令属主相同的权限。

[root@nfs01 ~]# chmod u+s `which rsync`           #<==在nfs01上给命令授权

 

#<==在m01上实现推送

[oldgirl@m01 ~]$ scp -P52113 hostsoldgirl@172.16.1.31:~   #<==先把文件推送过去

[oldgirl@m01 ~]$ ssh -p52113 oldgirl@172.16.1.31rsync ~/hosts /etc/hosts

#<==再利用已授权的命令来强制执行覆盖

 

2.4.3sudo提权实现没有权限用户拷贝※

所有的服务都配置sudoers文件:

#<==让所有的服务器都允许oldgirl用户使用rsync命令

echo "oldgirl ALL= NOPASSWD:/usr/bin/rsync" >>/etc/sudoers

visudo -c

 

[oldgirl@m01 ~]$ cp /etc/hosts .           #<==先把hosts文件拷贝到oldgirl的家目录

[oldgirl@m01 ~]$ scp -P52113 hostsoldgirl@172.16.1.8:~ #<==将本地文件推送到远端

[oldgirl@m01 ~]$ rsync -avz hosts -e 'ssh -p52113' oldgirl@172.16.1.8:~

#<==增量推送,它是加密的

 

#<==远程sudo,将远端家目录下的hosts文件直接覆盖/etc目录下的hosts文件

[oldgirl@m01 ~]$ ssh -p52113 -t oldgirl@172.16.1.8sudo rsync ~/hosts /etc/hosts

2.4.4批量分发文件脚本

[oldgirl@m01 ~]$ mkdir server/scripts -p

cd server/scripts/

cat >>fenfa.sh<<EOF

#!/bin/sh

scp -P52113 hosts oldgirl@172.16.1.31:~

ssh -p52113 -t oldgirl@172.16.1.31 sudo rsync~/hosts /etc/hosts

scp -P52113 hosts oldgirl@172.16.1.41:~

ssh -p52113 -t oldgirl@172.16.1.41 sudo rsync~/hosts /etc/hosts

scp -P52113 hosts oldgirl@172.16.1.8:~

ssh -p52113 -t oldgirl@172.16.1.8 sudo rsync~/hosts /etc/hosts

EOF

sh view_ip.sh

2.4.5优化脚本※※※※※

[oldgirl@m01 scripts]$ cp fenfa.sh fenfa1.sh

[oldgirl@m01 scripts]$ cat fenfa1.sh

#!/bin/sh

. /etc/init.d/functions

for n in 8 31 41

do

  scp-P52113 ~/hosts oldgirl@172.16.1.${n}:~ >/dev/null 2>&1 &&\

  ssh-p52113 -t oldgirl@172.16.1.$n sudo rsync ~/hosts /etc/hosts >/dev/null2>&1

  if [ $?-eq 0 ];then

    action"fenfa hosts 172.16.1.$n" /bin/true

  else

    action"fenfa hosts 172.16.1.$n" /bin/false

  fi

done

 

~可以实现输入要复制的文件,直接可以推送到远程的服务器

[oldgirl@m01 scripts]$ cp fenfa1.sh fenfa2.sh

[oldgirl@m01 scripts]$ cat fenfa2.sh

#!/bin/sh

. /etc/init.d/functions#<==调用函数库

 

if [ $# -ne 2 ];then#<==$#代表传参的个数,ne代表如果不等于2个

  echo"USAGE:/bin/sh $0 ARG1 ARG2"#<==打印帮助信息

  exit#<==并退出,让用户再次输入

fi

 

for n in 8 31 41

do

  scp-P52113 ~/$1 oldgirl@172.16.1.${n}:~ >/dev/null 2>&1 &&\#<==$1代表第1个参数

  ssh-p52113 -t oldgirl@172.16.1.$n sudo rsync ~/$1 $2 >/dev/null 2>&1#<==$2代表第2个参数

  if [ $?-eq 0 ];then#<==$?返回值是0,代表执行成功

    action"fenfa hosts 172.16.1.$n" /bin/true

  else

    action"fenfa hosts 172.16.1.$n" /bin/false

  fi

done

~验证

[oldgirl@m01 scripts]$ cd ../..

[oldgirl@m01 ~]$ touch a.txt

[oldgirl@m01 ~]$ sh server/scripts/fenfa2.sh

2.5 自动化批量管理方案

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

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

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

(4)     saltstack批量管理工具,特点:简单,功能强大,赶集网,小米,一些CDN公司。

(5)     http+cron

批量管理路线:sshkey  cfengine puppet  saltstack/ansible

 

2.6 expect非交互式功能

在m01上执行:

rpm -qa expect

yum install expect -y

#<==安装expect软件包后,会附带安装上mkpasswd命令,该命令可以生成随机字符串

 

[root@m01 ~]# mkpasswd -l 20   #<==生成随机字符串,-l参数指定生成字符串的长度

zo1bviqOf(xoj4uduxKc

 

2.6.1非交互密钥分发

2.6.2添加用户(所有机器)

useradd oldgirl888

echo 123456|passwd --stdin oldgirl888

id oldgirl888

 

2.6.3m01创建密钥对

su - oldgirl888

ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa>/dev/null 2>&1

 

2.6.4m01分发公钥expect脚本

[oldgirl888@m01 ~]$vim fenfa_sshkey.exp

#!/usr/bin/expect

if { $argc !=2 } {

  send_user"usage:expect fenfa-expect.exp file host\n"

  exit

}

 

#define var

set file [lindex $argv 0]

set host [lindex $argv 1]

set password "123456"

#spawn scp /etc/hosts root@10.0.0.142:/etc/hosts

#spawn scp -P52113 $file oldboy@$host:$dir

spawn ssh-copy-id -i $file "-p52113oldgirl888@$host"

expect {

   "yes/no"   {send "yes\r";exp_continue}

   "*password"   {send "$password\r"}

}

expect eof

 

exit -onexit {

  send_user"Oldboy say good bye to you!\n"

}

 

#scripts uasge

#expect oldboy-6.exp file host dir

#expamle

#expect fenfa_sshkey.exp file host

#./fenfa_sshkey.exp ~/hosts 172.16.1.41:~/hosts

 

~验证

[oldgirl888@m01 ~]$ expect fenfa_sshkey.exp.ssh/id_dsa.pub 172.16.1.31#<==管理机

 

[oldgirl888@nfs01 ~]$ ls .ssh/ #<==服务端,可以看到公钥被推送过来了

authorized_keys

 

[oldgirl888@m01 ~]$ ssh -p52113 oldgirl888@172.16.1.31/sbin/ifconfig eth0

eth0     Link encap:Ethernet  HWaddr00:0C:29:21:26:C7 

         inet addr:10.0.0.31 Bcast:10.0.0.255 Mask:255.255.255.0

         inet6 addr: fe80::20c:29ff:fe21:26c7/64 Scope:Link

          UPBROADCAST RUNNING MULTICAST MTU:1500  Metric:1

          RX packets:17426 errors:0 dropped:0overruns:0 frame:0

          TXpackets:10238 errors:0 dropped:0 overruns:0 carrier:0

         collisions:0 txqueuelen:1000

          RXbytes:4460294 (4.2 MiB)  TX bytes:1158786(1.1 MiB

 

2.6.5m01分发公钥脚本

循环expect脚本,达到非交互式的功能;

循环脚本如下:(fenfa_sshkey.sh)

[oldgirl888@m01 ~]$ cat fenfa_sshkey.sh

#!/bin/sh

. /etc/init.d/functions

for ip in 8 31 41

do

  expectfenfa_sshkey.exp ~/.ssh/id_dsa.pub 172.16.1.$ip >/dev/null 2>&1

  if [ $?-eq 0 ];then

     action"$ip" /bin/true

  else

     action"$ip" /bin/false

  fi

done

 

 

第3章 一键给多台服务器安装vsftpd服务

几乎所有的操作,全部在管理机上面操作。

3.1 创建用户(所有机器)

useradd oldboy888

echo 123456|passwd --stdin oldboy888

id oldboy888

 

3.2 配置sudoers(所有机器)

echo "oldboy888 ALL= NOPASSWD: ALL">>/etc/sudoers

visudo -c

su - oldboy888

 

3.3 脚本(m01)

3.3.1脚本路径

[root@m01 ~]# tree /home/oldboy888/

/home/oldboy888/

├── auto_deploy.sh       #<==一键安装软件的脚本(最后执行这个脚本)

├── fenfa_sshkey.exp       #<==一键分发公钥的脚本

└── scripts

    └── install.sh     #<==安装vsftpd软件的脚本

 

1 directory, 3 files

 

3.3.2安装软件

[oldboy888@m01 ~]$ mkdir scripts

[oldboy888@m01 ~]$ vim scripts/install.sh

[oldboy888@m01 ~]$ cat scripts/install.sh

yum install vsftpd -y

 

3.3.3分发公钥

[oldboy888@m01 ~]$ cat fenfa_sshkey.exp

#!/usr/bin/expect

if { $argc !=2 } {

  send_user"usage:expect fenfa-expect.exp file host\n"

  exit

}

 

#define var

set file [lindex $argv 0]

set host [lindex $argv 1]

set password "123456"

#spawn scp /etc/hosts root@10.0.0.142:/etc/hosts

#spawn scp -P52113 $file oldboy@$host:$dir

spawn ssh-copy-id -i $file "-p52113oldboy888@$host"

expect {

       "yes/no"        {send"yes\r";exp_continue}

       "*password"     {send"$password\r"}

}

expect eof

 

exit -onexit {

  send_user"Oldboy say good bye to you!\n"

}

 

#scripts uasge

#expect oldboy-6.exp file host dir

#expamle

#expect fenfa_sshkey.exp file host

#./fenfa_sshkey.exp ~/hosts 172.16.1.41:~/hosts

 

3.3.4一键安装软件

[oldboy888@m01 ~]$ cat auto_deploy.sh

#!/bin/sh

. /etc/init.d/functions

##1.Product key pair

ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa>/dev/null 2>&1

 if [ $? -eq0 ];then

     action"create dsa $ip" /bin/true

  else

     action"create dsa $ip" /bin/false

     exit 1

  fi

 

##2.Distribute pub key

for ip in 8 31 41

do

  expectfenfa_sshkey.exp ~/.ssh/id_dsa.pub 172.16.1.$ip >/dev/null 2>&1

  if [ $?-eq 0 ];then

     action"$ip" /bin/true

  else

     action"$ip" /bin/false

  fi

done

 

##3.Distribute fenfa scripts

for n in 8 31 41

do

 scp -P52113 -rp ~/scripts oldboy888@172.16.1.$n:~

done

 

##4.Install service soft

for m in 8 31 41

do

 ssh -t -p52113 oldboy888@172.16.1.$m sudo /bin/bash ~/scripts/install.sh

done

 

3.4 一键完美安装

见证奇迹的时刻!

[oldboy888@m01 ~]$ sh -x auto_deploy.sh       #<==参数-x可以看到执行脚本的过程

省略……

已安装:

  vsftpd.x86_64 0:2.2.2-21.el6                                                                                          

 

完毕!

Connection to 172.16.1.41closed.

 

3.5 打包备份

[root@m01 ~]# cd /home/

[root@m01 home]# tar zcvfauto_install_vsftpd_scripts.tar.gz ./oldboy888

[root@m01 home]# szauto_install_vsftpd_scripts.tar.gz -y

备份包存放路径:

I:\00-老男孩培训-软件\01-备份包

 

3.6 vim批量替换的方法

需求:把oldboy888替换为gongli

:%s@oldboy888@gongli@g

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值