SSH协议管理多主机(SSH协议的两种用法、生产环境用户初始化、结果返回值处理)
1 ssh协议简要介绍
1.1 基本概念
SSH是(Secure Shell)的缩写,安全外壳协议
专为远程登录会话和其他网络服务提供安全性的协议
先对数据包加密再传输,确保安全性
1.2 基本框架
1.3 SSH工作过程
①ssh版本协商
②密钥和算法协商
③认证阶段
④会话请求阶段
⑤交互会话阶段
2 shell中SSH协议的两种用法
2.1 基础概念
- SSH非免密登录执行-基于口令的验证
- SSH免密登录执行-基于密钥的验证
2.2 基于脚本进行SSH非免密登录执行
SSH指令输入缺点
通过SSH密码形式,可以指定用户名和密码通过SSH连接到远程主机并执行操作。在管理大量主机时,手动输入密码效率低。
[root@localhost ~]# ssh root@10.0.1.138 "df -h"
The authenticity of host '10.0.1.138 (10.0.1.138)' can't be established.
ECDSA key fingerprint is SHA256:LUW4qUtDjUV1HL3TK99daDGkNJIhujTDfK7F+BxaslM.
ECDSA key fingerprint is MD5:0d:c3:c6:95:52:c8:44:e8:40:66:87:a5:2b:95:14:85.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.1.138' (ECDSA) to the list of known hosts.
root@10.0.1.138's password:
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 12M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 46G 4.1G 42G 9% /
/dev/sda1 1014M 151M 864M 15% /boot
overlay 46G 4.1G 42G 9% /var/lib/docker/overlay2/3aebdb4bdcf0d130031bd229b351d92bf94154f51b5789cc4ff7f85562e9ec38/merged
tmpfs 378M 0 378M 0% /run/user/0
使用SSHpass工具,允许脚本中通过给定密码自动登录和执行指令。SSHpass使用-p参数提供密码,实现脚本中自动填写密码。
[root@localhost ~]# yum -y install sshpass
[root@localhost ~]# sshpass -p000000 ssh root@10.0.1.138 "df -h"
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 12M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 46G 4.1G 42G 9% /
/dev/sda1 1014M 151M 864M 15% /boot
overlay 46G 4.1G 42G 9% /var/lib/docker/overlay2/3aebdb4bdcf0d130031bd229b351d92bf94154f51b5789cc4ff7f85562e9ec38/merged
tmpfs 378M 0 378M 0% /run/user/0
SSH首次连接时会提示确认主机密钥,需要于动输入yes或no。
[root@localhost ~]# ssh root@10.0.1.138 "df -h"
Are you sure you want to continue connecting (yes/no)? yes
通过SSH命令的-o选项和StrictHostKeyChecking参数,可以设置为自动接受主机密钥,避免每次连接时手动确认。将参数值设为no,可以禁止显示提示性信息,实现在脚本中的自动连接。
[root@localhost ~]# sshpass -p000000 ssh -o StrictHostKeyChecking=no root@10.0.1.138 "ls"
anaconda-ks.cfg
脚本中封装SSH命令
1.编写脚本,封装SSH命令,实现批量执行和免密码输入。使用for循环遍历主机列表,通过SSHpass和-p参数自动登录并执行指令。使用变量引入用户名和密码,提高脚本的灵活性和可重复使用性。脚本执行时,通过传递参数指定要执行的指令,如df-h或uptime等。
#!/bin/bash
host_list="10.0.1.133 10.0.1.138"
user_name=root
user_pass=000000
for host in $host_list;dosshpass -p$user_pass ssh -o StrictHostKeyChecking=no $user_name@$host "$1"
done
[root@localhost shell]# sh ssh.sh hostname
localhost.localdomain
node
2.3 进行SSH免密登录
ssh免密登录过程
管理主机通过SSH协议免密登录到多台远程主机。
管理主机生成一对公钥和私钥,公钥分发给需要被管理的远程主机。
管理主机利用私钥与远程主机上的公钥进行匹配验证,实现免密登录。
免密环境配置
1.使用ssh-keygen指令生成公钥和私钥,并将公分发给远程主机。
2.通过SSH-copy-ID指令自动将公钥文件复制到远程主机并配置免密登录。
[root@localhost shell]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:WJ8v7E68CrI6EJrEmUQfgNpbWPMS/Den55uc78uDwiw root@localhost.localdomain
The keys randomart image is
+---[RSA 2048]----+
|oo.o |
|... * |
|+.o+ = . |
|o=o o ooo... |
|oo o ...S+o |
|+ . .o.. |
| . . .o o=.. |
| . oE.++o*. |
| .o. ..+O+=o |
+----[SHA256]-----+[root@localhost ~]# cd .ssh/
[root@localhost .ssh]# ls
id_rsa id_rsa.pub known_hosts[root@localhost .ssh]# ssh-copy-id root@10.0.1.138
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys[root@node ~]# cd .ssh/
[root@node .ssh]# ls
authorized_keys
[root@node .ssh]# cat authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAA root@localhost.localdomain
2.4 非免密和免密各自适用场景
非免密:集群环境初始化,免密环境初始化。
免密:
安全策略要求较高,root密码定期更换。
自动化运维工具必备,例如ansible。
分布式、大规模集群环境高效运维必备。
SSH非免密与免密的结合使用
第一步:利用SSH非免密创建免密环境
第二步:借组免密环境,利用其他自动化运维工具完成应用安装部署
3 生产环境集群初始化完整脚本
3.1 任务要求:
1、管理主机本地创建用户、设置密码
2、管理主机创建的用户生成密钥对
3、利用SSH非免密在所有主机创建用户
4、利用SSH非免密将管理主机公钥内容写入所有主机authorized_keys文件
[root@localhost shell]# cat init-env.sh
#!/bin/bash
if [ $# -lt 2 ];thenecho "Usage: $0 user_name user_pass"exit 1
fi
# 初始化变量
ROOT_PASS="000000"
USER_NAME=$1
USER_PASS=$2
HOST_LIST="10.0.1.138"
# 1、管理主机本地创建用户、设置密码
useradd $USER_NAME
echo "$USER_PASS" | passwd --stdin $USER_NAME
# 2、管理主机创建的用户生成密钥对
su - $USER_NAME -c "echo "" | ssh-keygen -t rsa"
PUB_KEY="`cat /home/$USER_NAME/.ssh/id_rsa.pub`"
# 3、利用SSH非免密在所有主机创建用户
# 4、利用SSH非免密将管理主机公钥内容写入所有主机authorized_keys文件
for host in $HOST_LIST;dosshpass -p$USER_PASS ssh -o StrictHostKeyChecking=no root@$host "useradd $USER_NAME"sshpass -p$USER_PASS ssh -o StrictHostKeyChecking=no root@$host "echo "$USER_PASS" | passwd --stdin $USER_NAME"sshpass -p$USER_PASS ssh -o StrictHostKeyChecking=no root@$host "mkdir /home/$USER_NAME/.ssh -pv"sshpass -p$USER_PASS ssh -o StrictHostKeyChecking=no root@$host "echo $PUB_KEY > /home/$USER_NAME/.ssh/authorized_keys"sshpass -p$USER_PASS ssh -o StrictHostKeyChecking=no root@$host "chmod 600 /home/$USER_NAME/.ssh/authorized_keys"sshpass -p$USER_PASS ssh -o StrictHostKeyChecking=no root@$host "chown -R $USER_NAME:$USER_NAME /home/$USER_NAME/.ssh"
done
3.2 任务验证:
[root@localhost shell]# chmod +x init-env.sh
[root@localhost shell]# sh init-env.sh usertest 000000
[root@localhost shell]# su - usertest
[usertest@localhost shell]# ssh usertest@10.0.1.138
[usertest@node]#
可以看到可以免密登录了即是成功
4 SSH跨主机执行指令结果返回值处理
1.通过SSH在管理主机上远程执行命令,需处理指令执行状态和结果。
2.指令执行成功通常返回0值,否则返回非0值。
[root@node0 shell]# ls
init-env.sh ssh.sh
[root@node0 shell]# echo $?
0
[root@node0 shell]# netstat -tnlp |grep :8000
[root@node0 shell]# echo $?
1
3.返回值处理对编写依赖指令执行结果的脚本。
4.1 脚本失败处理策略
1.监测脚本执行过程中的失败是非常重要的,以便及时采取措施。
2.推荐在脚本中加入错误处理逻辑,如遇到执行失败则立即退出脚本。
3.通过日志打印等方式及时报告执行失败,以便快速定位问题。
#!/bin/bash
#
#第一条指令
cat /etc/fstab
#第二条指令 明显没有这个指令
123456
#第三条指令
cat /etc/inittab
虽然第二个指令报错了,但是还是会运行第三个指令。使用以下方法来结束脚本。
#!/bin/bash
#
#第一条指令
cat /etc/fstab
if [ $? -eq 0 ];thenecho "123456"
elseexit 99
fi
#第二条指令 明显没有这个指令
123456 || exit 100
#第三条指令
cat /etc/inittab