Linux SSH批量分发管理
第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.
[email protected]'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 #<==再次远程登录服务端
[email protected]'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 #<==远程连接到服务器上
[email protected]'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连接管理,只有管理服务器能从内网卡连接到所有的服务器来管理。外网可以通过***拨号来管理,外网口全部不允许被连接管理,这样做是为了安全。
1.4.3验证
[root@s1 ~]# ssh -p52113 [email protected] #<==指定端口,指定用户名
[email protected]'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 [email protected] [ 命令 ]
ssh:固定命令
-p:指定端口
oldboy:服务端的用户名,以什么身份连接服务端
@:分隔符
172.16.1.61:服务端的内网IP
[ 命令 ]:连接到远程服务器,执行命令;但不登录到远程服务器
1.5.1.1 直接连接远程服务器
[root@s1 ~]# ssh -p52113 [email protected]
[email protected]'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 [email protected]/sbin/ifconfig eth0
[email protected]'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/[email protected]:/tmp
[email protected]'s password:
hosts
[root@m01 ~]# ls /tmp/ #<==服务端验证
hosts
~客户端将/etc目录复制到服务端的/tmp下
[root@s1 ~]# scp -P52113 -rp /[email protected]:/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 [email protected]:/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 [email protected] #<==s1是客户端
Connecting to 172.16.1.61...
[email protected]'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 [email protected]/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 p_w_picpath 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/[email protected]
#<==默认端口
ssh-copy-id -i ~/.ssh/id_dsa.pub "-p 52113 [email protected]"
#<==更改过的端口
操作过程如下:
~默认22端口
[oldgirl@m01 ~]$ ssh-copy-id -i ~/.ssh/[email protected]
[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 [email protected]"
[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 [email protected]/sbin/ifconfig eth0
[oldgirl@m01 ~]$ ssh -p52113 [email protected]/sbin/ifconfig eth0
[oldgirl@m01 ~]$ ssh -p52113 [email protected]/sbin/ifconfig eth0
2.3.6批量管理脚本(执行命令)
[oldgirl@m01 ~]$ mkdir server/scripts -p
cd server/scripts/
cat >>view_ip.sh< #!/bin/sh ssh -p52113 [email protected] /sbin/ifconfig eth0 ssh -p52113 [email protected] /sbin/ifconfigeth0 ssh -p52113 [email protected] /sbin/ifconfigeth0 EOF sh view_ip.sh [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 [email protected].$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: inet172.16.1.8/24 brd 172.16.1.255 scope global eth1 =========172.16.8.31========= 3: eth1: inet172.16.1.31/24 brd 172.16.1.255 scope global eth1 =========172.16.8.41========= 3: eth1: inet172.16.1.41/24 brd 172.16.1.255 scope global eth1 企业里实现ssh方案:3种。 条件:允许root用户ssh登录。 一个命令如果设置了suid,那么任何用户执行这个命令,就会有与这个命令属主相同的权限。 [root@nfs01 ~]# chmod u+s `which rsync` #<==在nfs01上给命令授权 #<==在m01上实现推送 [oldgirl@m01 ~]$ scp -P52113 [email protected]:~ #<==先把文件推送过去 [oldgirl@m01 ~]$ ssh -p52113 [email protected] ~/hosts /etc/hosts #<==再利用已授权的命令来强制执行覆盖 所有的服务都配置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 [email protected]:~ #<==将本地文件推送到远端 [oldgirl@m01 ~]$ rsync -avz hosts -e 'ssh -p52113' [email protected]:~ #<==增量推送,它是加密的 #<==远程sudo,将远端家目录下的hosts文件直接覆盖/etc目录下的hosts文件 [oldgirl@m01 ~]$ ssh -p52113 -t [email protected] rsync ~/hosts /etc/hosts [oldgirl@m01 ~]$ mkdir server/scripts -p cd server/scripts/ cat >>fenfa.sh< #!/bin/sh scp -P52113 hosts [email protected]:~ ssh -p52113 -t [email protected] sudo rsync~/hosts /etc/hosts scp -P52113 hosts [email protected]:~ ssh -p52113 -t [email protected] sudo rsync~/hosts /etc/hosts scp -P52113 hosts [email protected]:~ ssh -p52113 -t [email protected] sudo rsync~/hosts /etc/hosts EOF sh view_ip.sh [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 [email protected].${n}:~ >/dev/null 2>&1 &&\ ssh-p52113 -t [email protected].$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 [email protected].${n}:~ >/dev/null 2>&1 &&\#<==$1代表第1个参数 ssh-p52113 -t [email protected].$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 (1) 最简单常用ssh key,功能最强大,一般中小型企业会用,50—100台以下。 (2) sina cfengine/puppet较早的批量管理工具,现在基本没有企业用。 (3) 门户级别比较流行的,puppet批量管理工具,复杂,笨重。 (4) saltstack批量管理工具,特点:简单,功能强大,赶集网,小米,一些CDN公司。 (5) http+cron 批量管理路线:sshkey cfengine puppet saltstack/ansible 在m01上执行: rpm -qa expect yum install expect -y #<==安装expect软件包后,会附带安装上mkpasswd命令,该命令可以生成随机字符串 [root@m01 ~]# mkpasswd -l 20 #<==生成随机字符串,-l参数指定生成字符串的长度 zo1bviqOf(xoj4uduxKc useradd oldgirl888 echo 123456|passwd --stdin oldgirl888 id oldgirl888 su - oldgirl888 ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa>/dev/null 2>&1 [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 [email protected]:/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 [email protected]/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 循环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 几乎所有的操作,全部在管理机上面操作。 useradd oldboy888 echo 123456|passwd --stdin oldboy888 id oldboy888 echo "oldboy888 ALL= NOPASSWD: ALL">>/etc/sudoers visudo -c su - oldboy888 [root@m01 ~]# tree /home/oldboy888/ /home/oldboy888/ ├── auto_deploy.sh #<==一键安装软件的脚本(最后执行这个脚本) ├── fenfa_sshkey.exp #<==一键分发公钥的脚本 └── scripts └── install.sh #<==安装vsftpd软件的脚本 1 directory, 3 files [oldboy888@m01 ~]$ mkdir scripts [oldboy888@m01 ~]$ vim scripts/install.sh [oldboy888@m01 ~]$ cat scripts/install.sh yum install vsftpd -y [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 [email protected]:/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 [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 [email protected].$n:~ done ##4.Install service soft for m in 8 31 41 do ssh -t -p52113 [email protected].$m sudo /bin/bash ~/scripts/install.sh done 见证奇迹的时刻! [oldboy888@m01 ~]$ sh -x auto_deploy.sh #<==参数-x可以看到执行脚本的过程 省略…… 已安装: vsftpd.x86_64 0:2.2.2-21.el6 完毕! Connection to 172.16.1.41closed. [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-备份包 需求:把oldboy888替换为gongli :%s@oldboy888@gongli@g 2.3.7优化脚本※※※※※
2.4 实现提权多种解决方案实践
2.4.1直接root用户分发sshkey
2.4.2利用suid实现没有权限用户拷贝(只做了解!)
2.4.3sudo提权实现没有权限用户拷贝※
2.4.4批量分发文件脚本
2.4.5优化脚本※※※※※
2.5 自动化批量管理方案
2.6 expect非交互式功能
2.6.1非交互密钥分发
2.6.2添加用户(所有机器)
2.6.3m01创建密钥对
2.6.4m01分发公钥expect脚本
2.6.5m01分发公钥脚本
第3章 一键给多台服务器安装vsftpd服务
3.1 创建用户(所有机器)
3.2 配置sudoers(所有机器)
3.3 脚本(m01)
3.3.1脚本路径
3.3.2安装软件
3.3.3分发公钥
3.3.4一键安装软件
3.4 一键完美安装
3.5 打包备份
3.6 vim批量替换的方法