当前位置: 首页 > news >正文

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 人工智能算法工程师(高级)课程11-自然语言处理之NLP的语言模型-seq2seq模型,seq+注意力与代码详解
  • 【数据结构】链表篇
  • 深入解析:Amazon Bedrock 上 Claude 3 Haiku 的微调测试报告
  • 基于STM32的智能宠物喂食器
  • MySQL的索引事务和JDBC编程
  • QT(2.0)
  • Datawhale AI 夏令营(2024第三期)AI+逻辑推理方向 模型微调学习笔记
  • MySQL——数据表的基本操作(四)删除数据表
  • 避免死锁的资源分配算法——银行家算法
  • C语言——扫雷游戏
  • Python基础—any(),all()函数你会用吗?
  • .net core + vue 搭建前后端分离的框架
  • Java的jstat命令输出GC信息时携带时间信息(Windows系统中)
  • Unity检测鼠标进入、离开UI
  • Gartner发布2024年网络风险管理成熟度曲线:使网络安全战略与业务目标保持一致的概念、方法、流程和技术
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • in typeof instanceof ===这些运算符有什么作用
  • Java 内存分配及垃圾回收机制初探
  • javascript 总结(常用工具类的封装)
  • maven工程打包jar以及java jar命令的classpath使用
  • node-glob通配符
  • spring + angular 实现导出excel
  • Tornado学习笔记(1)
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 第2章 网络文档
  • 关于Flux,Vuex,Redux的思考
  • 算法之不定期更新(一)(2018-04-12)
  • 因为阿里,他们成了“杭漂”
  • 在Docker Swarm上部署Apache Storm:第1部分
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​Benvista PhotoZoom Pro 9.0.4新功能介绍
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #pragma once
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (函数)颠倒字符串顺序(C语言)
  • (十八)Flink CEP 详解
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • (一)RocketMQ初步认识
  • (译)计算距离、方位和更多经纬度之间的点
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)Oracle存储过程编写经验和优化措施
  • .NET 发展历程
  • .net 反编译_.net反编译的相关问题
  • .Net 知识杂记
  • .Net面试题4
  • @antv/g6 业务场景:流程图
  • @DataRedisTest测试redis从未如此丝滑
  • [ C++ ] STL---string类的模拟实现