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;do
   sshpass -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 ];then
    echo "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;do
    sshpass -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 ];then
    echo "123456"
else
    exit 99
fi
#第二条指令 明显没有这个指令
123456  || exit 100
#第三条指令
cat /etc/inittab
  • 17
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值