1-部署环境。

[root@m01 ~]# cat /etc/redhat-release
CentOS release 6.9 (Final)
[root@m01 ~]# uname -r
2.6.32-696.el6.x86_64

2-实现架构拓扑。

3-具体步骤。

1-批量添加用户oldboy

[root@m01 ~]# useradd oldboy
[root@m01 ~]# echo 123456|passwd --stdin oldboy

2-调整优化 ssh 配置文件

[root@m01 ~]# sed -i '13 iPort 52113\nPermitRootLogin no\nPermitEmptyPasswords no\nUserDNS no\nGSSAPIAuthentication no' /etc/ssh/sshd_config

3-hosts 解析

[root@m01 ~]# cat >>/etc/hosts<<EOF
172.16.1.5 lb01
172.16.1.6 lb02
172.16.1.7 web02
172.16.1.8 web01
172.16.1.51 db01
172.16.1.31 nfs01
172.16.1.41 backup
172.16.1.61 m01
EOF

4-用普通用户生成密钥。

[root@m01 ~]su - oldboy
[oldboy@m01 ~]$ ssh-keygen -t dsa (一路回车)
#--->ssh-keygen 是生产秘钥的工具, -t 指定建立秘钥的类型,这里是建立 dsa 类型秘钥
#--->也可以执行 ssh-keygen -t rsa 来建立 rsa 类型秘钥
#--->RSA 与 DSA 加密算法的区别
#--->RSA 是一种加密算法(PS:RSA 也可以进行数字签名),它的简写的来由是 Ron vest,Adi shamir和 Leonard adaemon,这三个首字母连接起来就是 RSA
#--->DSA 就是数字签名算法的英文全称的简写,即 Digital Signature Algorithm,简写就是 DSA,RSA 既可以进行加密也可以进行数字签名实现认证,而 DSA 只能用于数字签名实现认证。

非交互式创建密钥:

1、一键生成密钥对 ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1

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

[oldboy@m01 ~]$ ls .ssh/ -al
total 20
drwx------ 2 oldboy oldboy 4096 Apr 17 21:33 .
drwx------ 3 oldboy oldboy 4096 Apr 17 22:01 ..
-rw------- 1 oldboy oldboy  668 Apr 17 21:23 id_dsa
-rw-r--r-- 1 oldboy oldboy  600 Apr 17 21:23 id_dsa.pub
-rw-r--r-- 1 oldboy oldboy  786 Apr 17 21:34 known_host

5-分发公钥。

未更改默认端口的话,执行:

[oldboy@m01 ~]$ ssh-copy-id -i .ssh/id_dsa.pub oldboy@172.16.1.41

已更改端口的话,执行:

ssh-copy-id -i .ssh/id_dsa.pub "-p 52113 oldboy@172.16.1.41"
#该命令只能发公钥,不能发私钥

在backup上查看,发现被改名为权限是 600 的 autorized_keys.

[oldboy@backup ~]$ ls -l ./.ssh/
total 12
-rw-------. 1 oldboy oldboy 600 Apr 17 21:33 authorized_keys
-rw-------. 1 oldboy oldboy 668 Apr 17 21:31 id_dsa
-rw-r--r--. 1 oldboy oldboy 603 Apr 17 21:31 id_dsa.pub

也可以通过 scp、 rsync 等手动拷贝(需要注意 600 的权限以及更名 authorized_keys)

6-批量操作测试。

批量查看1:

[oldboy@m01 ~]$ cat neihe.sh
#!/bin/sh
for n in 31 41
do
ssh -p22 172.16.1.$n cat /etc/redhat-release
done
[oldboy@m01 ~]$ bash neihe.sh
CentOS release 6.9 (Final)
CentOS release 6.9 (Final)

批量查看2:

[oldboy@m01 ~]$ cat neihe.sh
#!/bin/sh
for n in 31 41
do
  echo "===172.16.1.$n==="
  ssh -p22 172.16.1.$n $1
done
[oldboy@m01 ~]$ sh neihe.sh "cat /etc/redhat-release"
===172.16.1.31===
CentOS release 6.9 (Final)
===172.16.1.41===
CentOS release 6.9 (Final)
[oldboy@m01 ~]$ sh neihe.sh "/sbin/ifconfig eth0"

批量分发1:

[oldboy@m01 ~]$ cat neihe.sh
#!/bin/sh
for n in 31 41
do
  echo "===172.16.1.$n==="
  scp -P22 $1 172.16.1.$n:~
done
[oldboy@m01 ~]$ scp -P22 444 172.16.1.31:
/etc/ #只能推送到对方服务器oldboy的家目录
scp: /etc//444: Permission denied
[oldboy@m01 ~]$ scp -P22 444 172.16.1.31:~
444                   100%    0     0.0KB/s   00:00
[oldboy@nfs01 ~]$ ls
111  222  333  444

批量分发2:

[oldboy@m01 ~]$ vim neihe.sh
#!/bin/sh
if [ $# -ne 1 ];then
echo "USAGE:/bin/sh $0 FILENAME"
exit 1
fi
for n in 31 41
do
  echo "===172.16.1.$n==="
  scp -P22 $1 172.16.1.$n:~
done
[oldboy@m01 ~]$ bash neihe.sh
USAGE:/bin/sh neihe.sh FILENAME
[oldboy@m01 ~]$ bash neihe.sh 555
===172.16.1.31===
555                   100%    0     0.0KB/s   00:00    
===172.16.1.41===
555                   100%    0     0.0KB/s   00:00  
[oldboy@backup ~]$ ls
111  222  333  555

批量分发3:

[oldboy@m01 ~]$ vim neihe.sh
#!/bin/sh
. /etc/init.d/functions
if [ $# -ne 1 ];then
  echo "USAGE:/bin/sh $0 FILENAME"
  exit 1
fi
  for n in 31 41
do
  echo "===172.16.1.$n==="
  scp -P22 $1 172.16.1.$n:~ &>/dev/null
  if [ $? -eq 0 ];then
  action "dis $1 to 172.16.1.$n" /bin/true
  else
  action "dis $1 to 172.16.1.$n" /bin/false
fi
done
[oldboy@m01 ~]$ bash neihe.sh 666
===172.16.1.31===
dis 666 to 172.16.1.31                                 [  OK  ]
===172.16.1.41===
dis 666 to 172.16.1.41                                 [  OK  ]

4-SSH 免密码登陆小结:

1) 免密码登陆验证是单向的,方向从私钥(钥匙) ===》公钥(锁)

2) ssh免密码登陆是基于相同用户,最好不要跨不同的用户

3) ssh连接慢的问题解决方案(优化/etc/ssh/sshd_config)

5-SSH 批量管理步骤:

1) 所有机器创建用户及密码

useradd oldboy

echo 123456|passwd --stdin oldboy

id oldboy

su - oldboy

2) 创建秘钥对

ssh-keygen -t dsa(全部回车至无需确认为止)

3) m01 分发公钥

ssh 默认 22 端口时:

ssh-copy-id -i .ssh/id_dsa.pub oldboy@172.16.1.41

ssh 端口非默认时:

ssh-copy-id -i .ssh/id_dsa.pub “-p 52113 oldboy@172.16.1.31”

4) 测试

ssh -p52113 oldboy@172.16.1.31 /sbin/ifconfig eth0

非第一次不需输入密码即为正确

注意: ssh -p52113 oldboy@172.16.1.31 “cat /etc/redhat-release”

有间隔的整条命令最好用“”括起来

7-SSH批量分发提权

方法1:配置sudoers

1-配置sudoers(在服务器backup配置)

[root@backup ~]# echo "oldboy ALL= NOPASSWD: /usr/bin/rsync" >>/etc/sudoers

2-先scp复制到家目录

[oldboy@m01 ~]$ scp -P22 hosts oldboy@172.16.1.41:~

3-再ssh复制到/etc/hosts

[oldboy@m01 ~]$ ssh -p22 -t oldboy@172.16.1.41 sudo rsync -avz ~/hosts /etc/hosts

方法2:设置 suid 权限

[root@nfs01 ~]# ls -l `which rsync`
-rwxr-xr-x. 1 root root 414968 Apr 30 2014 /usr/bin/rsync
[root@nfs01 ~]# chmod u+s `which rsync` (chmod 4755 `which rsync`)
[root@nfs01 ~]# ls -l `which rsync`
-rwsr-xr-x. 1 root root 414968 Apr 30 2014 /usr/bin/rsync
[oldboy@m01 ~]$ scp -P22 hosts oldboy@172.16.1.31:~
#端口22的话可以省略,即-P22可以去掉
[oldboy@m01 ~]$ ssh -p22 oldboy@172.16.1.31 rsync -avz ~/hosts /etc/hosts

方法3:直接使用 root

需要取消 ssh 配置文件里/etc/ssh/sshd_config禁止 root 登录的限制。

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

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

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

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

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

5) http+cron

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

8-如何实现自动创建秘钥对,同时分发公钥(编写脚本实现)

需要安装一个软件sshpass用来提供用户密码:

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum -y install sshpass
[root@m01 ~]# vim fenfa.sh
#!/bin/bash
###make key
\rm -f /root/.ssh/id_dsa
ssh-keygen -t dsa -f /root/.ssh/id_dsa -P "" -q
###fengfagongyao
for ip in 31 41
do
echo ====fenfa key to host 172.16.1.$ip====
sshpass -p111111 ssh-copy-id -i /root/.ssh/id_dsa.pub "-
o StrictHostKeyChecking=no root@172.16.1.$ip"
echo ===============fenfa end==============
echo ""
done

脚本说明:

ssh-keygen -t dsa -f /root/.ssh/id_dsa -P "" -q

创建密钥,-f指定存放位置,-P 密钥加密的密码  -q 减少信息输出

sshpass -p111111 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no root@172.16.1.$ip"

ssh-copy-id 命令来分发密钥 -i 指定密钥本地存放的路径

-o StrictHostKeyChecking=no 在登陆其他服务器时不选择yes/no