(转)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
(转)Linux SSH批量分发管理的更多相关文章
- (转)SSH批量分发管理&非交互式expect
目录 1 SSH批量分发管理 1.1 测试环境 1.2 批量管理步骤 1.3 批量分发管理实例 1.3.1 利用sudo提权来实现没有权限的用户拷贝 1.3.2 利用sudo提权开发管理脚本 1.3. ...
- 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先对联机数据包通过加密技术进行加密处理,加密后再进行数据 ...
- Linux ssh命令详解
SSH(远程连接工具)连接原理:ssh服务是一个守护进程(demon),系统后台监听客户端的连接,ssh服务端的进程名为sshd,负责实时监听客户端的请求(IP 22端口),包括公共秘钥等交换等信息. ...
- Linux ssh命令
SSH(远程连接工具)连接原理:ssh服务是一个守护进程(demon),系统后台监听客户端的连接,ssh服务端的进程名为sshd,负责实时监听客户端的请求(IP 22端口),包括公共秘钥等交换等信息. ...
随机推荐
- Windows Server 2003 asp网页不能访问的常见问题
1. [开始]--[程序]--[管理工具]--[Internet信息服务管理器],在服务器名下的“web服务扩展”的右窗口,单击active server pages -> 单击[允许].2. ...
- 最近做手机端,GPS,微信QQ分享总结的问题
Android端 百度地图: 1.libs包中armeabi下liblocSDK4d.so文件丢失,导致百度定位失效. 微信分享: 1.分享App,app的内容(图片加描述)不能超过32kb ,不然无 ...
- Server Sql 多表查询、子查询和分页
一.多表查询:根据特定的连接条件从不同的表中获取所需的数据 多表查询语法: SELECT table1.column, table2.column FROM table1, table2 WHERE ...
- 如何让win32对话框居中显示
在编写win32对话框程序,如果是用visual studio建的win32对话框程序,默认是不居中显示的,about 对话框也是这样的,用资源编辑器打开,可以在属性里面设置居中center 为tur ...
- 十三、Node.js-fs模块(上)
Node.js内置的fs模块就是文件系统模块,负责读写文件以及对文件进行相关操作. 下面直接可参考下面的代码进行fs模块里面基本方法的学习: /** * Created by Administrato ...
- 关于MultiDataTrigger和MultiTrigger的一些注意事项
他俩有着相同的语法. 都是在conditions中编写触发条件. 因为都是同一个触发类. 在conditions中有Property和Binding这两个属性.那么这两个可以同时使用吗?当然是不可以的 ...
- 离线安装 python 第三方库
离线安装 python 第三方库 首先你需要在联网的服务器上已经安装了一个第三方库,比如是paramiko,也就是说你已经执行了 pip install paramiko ,小提示: 如果在安 ...
- html->head->body
ps:大师兄的博客链接http://www.imdsx.cn/ http://ui.imdsx.cn/html/ html 相当于一个人 css 相当于为这个人穿上漂亮的衣服,化妆 js 相当于 ...
- 【bzoj4817】树点涂色 LCT+线段树+dfs序
Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...
- Python爬取招聘信息,并且存储到MySQL数据库中
前面一篇文章主要讲述,如何通过Python爬取招聘信息,且爬取的日期为前一天的,同时将爬取的内容保存到数据库中:这篇文章主要讲述如何将python文件压缩成exe可执行文件,供后面的操作. 这系列文章 ...