5.SSH远程服务管理

SSH协议


ssh协议介绍

SSH是一个安全协议,在进行数据传输时,会对数据包进行加密处理,加密后在进行数据传输。确保了数据传输安全。那 SSH 服务主要功能有哪些呢?

1.提供远程连接服务器的服务
2.对传输的数据进行加密

为什么不用telnet远程连接

1)刚安装完的系统,没有telnet的服务端,只有ssh的服务端
2)telnet的数据,是明文传输,不安全
服务连接方式服务数据传输服务监听端口服务登录用户应用场景
ssh加密22/tcp默认支持root用户登陆默认使用openssh
telnet明文23/tcp不支持root用户登陆升级openssh时候,启动telnet
企业面试题
#下列服务都是用什么端口
ftp:21
dns:53
ssh:22
telnet:23
mysql:3306
http:80
https:443
rsync:873
smtp:25
pop3:110
rdp:remote desktop protocol 3389
[root@web02 ~]# cat /etc/ssh/sshd_config 
.....
#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
.........
Openssh服务端配置详解
连接加速
UseDNS no是否开启反向解析:ip——>域名或主机名
GSSAPIAuthentication noGSS 认证功能关闭
安全优化项目
Port默认端口Port 22 端口范围1-65535 推荐1w以上的端口
PermitRootLogin禁止root用户远程登陆权限。默认是yes(可以让root远程登陆)使用建议:先添加普通用户配置sudo权限,然后在禁用
ListenAddress监听的地址(后面需要指定本地网卡的ip地址),目的是控制用户只能通过内网访问

ssh相关命令

## ssh 远程连接
[root@web01 ~]# ssh -p 22 root@172.16.1.31
[root@web02 ~]# ssh -p 22 zls@172.16.1.7
-p:指定端口(默认是22号端口)
root:远程连接用户名
@:分隔符
172.16.1.31:远程主机的IP地址
[root@web01 ~]# ssh root@172.16.1.31 'ifconfig'

## scp 远程拷贝
[root@web01 ~]# scp -rp /etc/ root@172.16.1.41:/tmp
[root@web01 ~]# scp -P 2222 -rp /etc/ root@172.16.1.41:/tmp
[root@m01 ~]# scp -rp -l 8096 /opt/1.txt root@172.16.1.31:/tmp
# 推
[root@m01 ~]# scp 1.sh 172.16.1.31:/tmp
# 拉
[root@m01 ~]# scp 172.16.1.41:/backup/web02_md5.txt .
-r:递归
-p:保持属性
-P:指定端口
-o StrictHostKeyChecking=no:不验证指纹
-l 限制传输使用带宽(默认kb)

SSH免密连接方式

默认情况下,通过ssh客户端命令登陆远程服务器,需要提供远程系统上的帐号与密码,但为了降低密码泄露的机率和提高登陆的方便性,建议使用密钥验证方式。
在这里插入图片描述

# 密钥对:由公钥 + 私钥组成
公钥:门锁
私钥:钥匙
# 1.生成密钥对
[root@m01 ~]# ssh-keygen
Enter file in which to save the key (/root/.ssh/id_rsa): // 密钥对存放路径
Your identification has been saved in /root/.ssh/id_rsa. // 私钥
Your public key has been saved in /root/.ssh/id_rsa.pub. // 公钥
[root@m01 ~]# ll ~/.ssh/
total 8
-rw------- 1 root root 1675 May 17 11:49 id_rsa // 私钥:钥匙
-rw-r--r-- 1 root root 390 May 17 11:49 id_rsa.pub // 公钥:锁

# 2.免密连接web01
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.7
[root@m01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.1.8
[root@m01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.1.31
[root@m01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.1.41


1)在第一次连接服务器时,需要进行指纹认证
2)只要没有做免密的情况下,连接自己也需要输入密码(防止修改自己权限为root)
[root@m01 ~]# ssh root@172.16.1.31
The authenticity of host '172.16.1.31 (172.16.1.31)' can't be established.
ECDSA key fingerprint is SHA256:086q8NqRUTkXtvcfy0QckL5pD2RrVUo9qCu6lum+8gI.
ECDSA key fingerprint is MD5:81:cc:e8:88:ad:35:53:7d:07:22:9c:44:2a:6a:a2:2e.
Are you sure you want to continue connecting (yes/no)?

## ssh-copy-id 底层原理
1)远程创建.ssh目录
 [root@m01 ~]# ssh root@10.0.0.8 'mkdir /root/.ssh'
2)将公钥保存到需要免密控制的机器
[root@web02 ~]# vim /root/.ssh/authorized_keys
ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQDXrmYzl1/VAkM6pcAkjwuPzHzzhWKroscKwnGlsWLffgEe/WZT
2mqQqfygUNQmhZF3BLySTRlI/vVZKoLgqKBGr6CbRXPWi1ETKCYpbkK8NCj97wO3SV6Q01GU1sIcFAFV
pXl5O+BapM/tLJVC+5EJqtK+2O1am3PC2/OPxQJJXCYWg9GH4VZhTUK4jQISJX9YRMcY8/HFjhQkgHEA
/O6bFzeEFcfOodVfUKO2cauBLJTNw5UIRvsBX9cH10478pN3+QaZCTab2d43bfGW2A8b/tVXfumCF253
eBrPCA8mt1nAH+YRpPLRS4FovbqQpfFHn/fVR1WLDo5IYIUhbcPP root@m01

免密跳板机

#!/bin/bash
#jumpserver
lb01=10.0.0.5
lb02=10.0.0.6
web01=10.0.0.7
web02=10.0.0.8
web03=10.0.0.9
nfs=10.0.0.31
backup=10.0.0.41
db01=10.0.0.51
m01=10.0.0.61
zabbix=10.0.0.71

menu(){
        cat <<-EOF
        +-------------------------+
        |        1) lb01          |
        |        2) lb02          |
        |        3) web01         |
        |        4) web02         |
        |        5) web03         |
        |        6) nfs           |
        |        7) backup        |
        |        8) db01          |
        |        9) m01           |
        |        10)zabbix        |
        |        h) help          |
        +-------------------------+
EOF
}
#菜单函数

menu
#连接函数
connect(){
        ping -c 1 -w 1 $1 &>/dev/null
        if [ $? -eq 0 ];then
        ssh root@$1
        else
        echo -e "\033[5;4;40;31m 别连了,我的哥,$2:$1机器都没开!!!\033[0m"
        fi
        }
#控制不让输入ctrl+c,z
trap "" HUP INT TSTP
while true
do
        read -p "请输入要连接的主机编号:" num
        case $num in
        1|lb01)
        connect $lb01 lb01
                ;;
        2|lb02)
        connect $lb02 lb02
                ;;
        3|web01)
        connect $web01 web01
                ;;
        4|web02)
        connect $web02 web02
                ;;
        5|web03)
        connect $web03 web03
                ;;
        6|nfs)
        connect $nfs nfs
                ;;
        7|backup)
        connect $backup backup
                ;;
        8|db01)
        connect $db01 db01
                ;;
        9|m01)
        connect $m01 m01
                ;;
        10|zabbix)
        connect $zabbix zabbix
                ;;
        h|help)
        clear
        menu
                ;;
        close)
        break
                ;;
esac
done

如何实现推送公钥脚本

# 1.免交互生成密钥对
[root@m01 ~]# ssh-keygen -t rsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1

# 2.免交互ssh命令
[root@m01 ~]# yum install -y sshpass
[root@m01 ~]# sshpass -p 1 ssh root@10.0.0.31

# 编写脚本
[root@m01 ~]# vim push_public_key.sh
#!/bin/bash
test -f ~/.ssh/id_dsa || ssh-keygen -t rsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
for ip in 7 8 31 41;do
  ping -c1 -W1 172.16.1.$ip &>/dev/null  
  [ $? -eq 0 ] &&\
  sshpass -p 1 ssh-copy-id -o StrictHostKeyChecking=no -i ~/.ssh/id_dsa.pub root@172.16.1.$ip &>/dev/null &&\
  echo "172.16.1.$ip 推送成功..." ||\
  echo "172.16.1.$ip 推送失败..."
done



[root@m01 ~]# vim push_public_key_v2.sh
#!/bin/bash
. /etc/init.d/functions
test -f ~/.ssh/id_dsa || ssh-keygen -t rsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
for ip in 7 8 31 41;do
ping -c1 -W1 172.16.1.$ip &>/dev/null
[ $? -eq 0 ] &&\
sshpass -p 1 ssh-copy-id -o StrictHostKeyChecking=no -i ~/.ssh/id_dsa.pub
root@172.16.1.$ip &>/dev/null &&\
action "172.16.1.$ip" /bin/true ||\
action "172.16.1.$ip" /bin/false
done

## 将脚本变成二进制文件(起到保护不显示密码的作用 )
## sh不识别二进制文件,执行脚本用  ./
[root@m01 ~]# yum install -y shc
[root@m01 ~]# shc -f ip_host.sh

ssh免交互语言expect(了解)

# 1.安装expect
[root@m01 ~]# yum install -y expect



#!/usr/bin/expect
set ip 10.0.0.41
set pass 1
set timeout 30
spawn ssh root@$ip
expect {
	"(yes/no)" {send "yes\r"; exp_continue}
	"password:" {send "$pass\r"}
}
expect "root@*" {send "df -h\r"}
expect "root@*" {send "exit\r"}
expect eof


## 循环多台机器
[root@m01 ~]# !vim
vim 1.exp


#!/bin/expect
set pass 1
foreach ip {"7" "8" "31" "41"} {
	puts "当前IP地址: $ip"
	spawn ssh root@172.16.1.$ip
	expect {
		"(yes/no)" {send "yes\r"; exp_continue}
		"password:" {send "$pass\r"}
}
	expect "root@*" {send "df -h\r"}
	expect "root@*" {send "exit\r"}
	expect eof
}

SSH优化

# 1.修改ssh默认端口
[root@m01 ~]# vim /etc/ssh/sshd_config
Port 2222

# 2.不允许使用root登录
PermitRootLogin No // 38

# 3.不使用DNS
UseDNS no // 115

# 4.禁止使用密码登录
PasswordAuthentication no // 65

# 5.禁止使用GSS认证
GSSAPIAuthentication no
2fa:google二次认证
Port 6666 # 变更SSH服务远程连接端口
PermitRootLogin no # 禁止root用户直接远程登录
PasswordAuthentication no # 禁止使用密码直接远程登录
UseDNS no # 禁止ssh进行dns反向解析,影响ssh连接效率参数
GSSAPIAuthentication no # 禁止GSS认证,减少连接时产生的延迟

巡检脚本

机器:web01 web02 nfs backup
# 每台机器内存信息:
总内存:
可用内存:
已使用内存:
swap总大小:
swap可用:
swap已使用:
# 每台机器磁盘信息
/分区剩余:
/分区总共:
/分区已使用:
# 机器负载
1分钟:
5分钟:
15分钟:
# 1.免密
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub 10.0.0.7
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub 10.0.0.8
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub 10.0.0.31
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub 10.0.0.41
# 2.编写脚本
[root@m01 ~]# cat check.sh

#!/bin/bash
## mem var
mem_total=`free -m|awk '/Mem/{print $2}'`
mem_ava=`free -m|awk '/Mem/{print $NF}'`
mem_used=`free -m|awk '/Mem/{print $3}'`
## swap var
swap_total=`free -m|awk '/Swap/{print $2}'`
swap_ava=`free -m|awk '/Swap/{print $NF}'`
swap_used=`free -m|awk '/Swap/{print $3}'`
## disk var
disk_total=`df -h|awk '/\/$/{print $2}'`
disk_ava=`df -h|awk '/\/$/{print $4}'`
disk_used=`df -h|awk '/\/$/{print $3}'`
## sys var
avg_one=`uptime|sed -nr 's#.*:(.*),(.*),(.*)#\1#gp'`
avg_five=`uptime|sed -nr 's#.*:(.*),(.*),(.*)#\2#gp'`
avg_fifteen=`uptime|sed -nr 's#.*:(.*),(.*),(.*)#\3#gp'`
echo "---- web01 info ----"
ssh root@172.16.1.7 "echo web01 总内存: $mem_total"
ssh root@172.16.1.7 "echo web01 可用内存: $mem_ava"
ssh root@172.16.1.7 "echo web01 已使用内存: $mem_used"
ssh root@172.16.1.7 "echo web01 swap总大小: $swap_total"
ssh root@172.16.1.7 "echo web01 swap可用: $swap_ava"
ssh root@172.16.1.7 "echo web01 swap已使用: $swap_used"
ssh root@172.16.1.7 "echo web01 /分区总共: $disk_total"
ssh root@172.16.1.7 "echo web01 /分区剩余: $disk_ava"
ssh root@172.16.1.7 "echo web01 /分区已使用 $disk_used"
ssh root@172.16.1.7 "echo web01 1分钟: $avg_one"
ssh root@172.16.1.7 "echo web01 5分钟: $avg_five"
ssh root@172.16.1.7 "echo web01 15分钟: $avg_fifteen"
echo "---- web02 info ----"
ssh root@172.16.1.8 "echo web02 总内存: $mem_total"
ssh root@172.16.1.8 "echo web02 可用内存: $mem_ava"
ssh root@172.16.1.8 "echo web02 已使用内存: $mem_used"
ssh root@172.16.1.8 "echo web02 swap总大小: $swap_total"
ssh root@172.16.1.8 "echo web02 swap可用: $swap_ava"
ssh root@172.16.1.8 "echo web02 swap已使用: $swap_used"
ssh root@172.16.1.8 "echo web02 /分区总共: $disk_total"
ssh root@172.16.1.8 "echo web02 /分区剩余: $disk_ava"
ssh root@172.16.1.8 "echo web02 /分区已使用 $disk_used"
ssh root@172.16.1.8 "echo web02 1分钟: $avg_one"
ssh root@172.16.1.8 "echo web02 5分钟: $avg_five"
ssh root@172.16.1.8 "echo web02 15分钟: $avg_fifteen"
echo "---- nfs info ----"
ssh root@172.16.1.31 "echo nfs 总内存: $mem_total"
ssh root@172.16.1.31 "echo nfs 可用内存: $mem_ava"
ssh root@172.16.1.31 "echo nfs 已使用内存: $mem_used"
ssh root@172.16.1.31 "echo nfs swap总大小: $swap_total"
ssh root@172.16.1.31 "echo nfs swap可用: $swap_ava"
ssh root@172.16.1.31 "echo nfs swap已使用: $swap_used"
ssh root@172.16.1.31 "echo nfs /分区总共: $disk_total"
ssh root@172.16.1.31 "echo nfs /分区剩余: $disk_ava"
ssh root@172.16.1.31 "echo nfs /分区已使用 $disk_used"
ssh root@172.16.1.31 "echo nfs 1分钟: $avg_one"
ssh root@172.16.1.31 "echo nfs 5分钟: $avg_five"
ssh root@172.16.1.31 "echo nfs 15分钟: $avg_fifteen"
echo "---- backup info ----"
ssh root@172.16.1.41 "echo backup 总内存: $mem_total"
ssh root@172.16.1.41 "echo backup 可用内存: $mem_ava"
ssh root@172.16.1.41 "echo backup 已使用内存: $mem_used"
ssh root@172.16.1.41 "echo backup swap总大小: $swap_total"
ssh root@172.16.1.41 "echo backup swap可用: $swap_ava"
ssh root@172.16.1.41 "echo backup swap已使用: $swap_used"
ssh root@172.16.1.41 "echo backup /分区总共: $disk_total"
ssh root@172.16.1.41 "echo backup /分区剩余: $disk_ava"
ssh root@172.16.1.41 "echo backup /分区已使用 $disk_used"
ssh root@172.16.1.41 "echo backup 1分钟: $avg_one"
ssh root@172.16.1.41 "echo backup 5分钟: $avg_five"
ssh root@172.16.1.41 "echo backup 15分钟: $avg_fifteen"



# 循环的方式
[root@m01 ~]#  vim check.sh
#!/bin/bash
## mem var
mem_total=`free -m|awk '/Mem/{print $2}'`
mem_ava=`free -m|awk '/Mem/{print $NF}'`
mem_used=`free -m|awk '/Mem/{print $3}'`

## swap var
swap_total=`free -m|awk '/Swap/{print $2}'`
swap_ava=`free -m|awk '/Swap/{print $NF}'`
swap_used=`free -m|awk '/Swap/{print $3}'`

## disk var
disk_total=`df -h|awk '/\/$/{print $2}'`
disk_ava=`df -h|awk '/\/$/{print $4}'`
disk_used=`df -h|awk '/\/$/{print $3}'

## sys var
avg_one=`uptime|sed -nr 's#.*:(.*),(.*),(.*)#\1#gp'`
avg_five=`uptime|sed -nr 's#.*:(.*),(.*),(.*)#\2#gp'`
avg_fifteen=`uptime|sed -nr 's#.*:(.*),(.*),(.*)#\3#gp'`
for ip in 7 8 31 41;do
echo "---- 172.16.1.$ip info ----"
ssh root@172.16.1.$ip "echo 172.16.1.$ip 总内存: $mem_total"
ssh root@172.16.1.$ip "echo 172.16.1.$ip 可用内存: $mem_ava"
ssh root@172.16.1.$ip "echo 172.16.1.$ip 已使用内存: $mem_used"
ssh root@172.16.1.$ip "echo 172.16.1.$ip swap总大小: $swap_total"
ssh root@172.16.1.$ip "echo 172.16.1.$ip swap可用: $swap_ava"
ssh root@172.16.1.$ip "echo 172.16.1.$ip swap已使用: $swap_used"
ssh root@172.16.1.$ip "echo 172.16.1.$ip /分区总共: $disk_total"
ssh root@172.16.1.$ip "echo 172.16.1.$ip /分区剩余: $disk_ava"
ssh root@172.16.1.$ip "echo 172.16.1.$ip /分区已使用 $disk_used"
ssh root@172.16.1.$ip "echo 172.16.1.$ip 1分钟: $avg_one"
ssh root@172.16.1.$ip "echo 172.16.1.$ip 5分钟: $avg_five"
ssh root@172.16.1.$ip "echo 172.16.1.$ip 15分钟: $avg_fifteen"
done


[root@m01 ~]# cat check.sh
#!/bin/bash
## mem var
mem_total=`free -m|awk '/Mem/{print $2}'`
mem_ava=`free -m|awk '/Mem/{print $NF}'`
mem_used=`free -m|awk '/Mem/{print $3}'`
## swap var
swap_total=`free -m|awk '/Swap/{print $2}'`
swap_ava=`free -m|awk '/Swap/{print $NF}'`
swap_used=`free -m|awk '/Swap/{print $3}'`
## disk var
disk_total=`df -h|awk '/\/$/{print $2}'`
disk_ava=`df -h|awk '/\/$/{print $4}'`
disk_used=`df -h|awk '/\/$/{print $3}'`
## sys var
avg_one=`uptime|sed -nr 's#.*:(.*),(.*),(.*)#\1#gp'`
avg_five=`uptime|sed -nr 's#.*:(.*),(.*),(.*)#\2#gp'`
avg_fifteen=`uptime|sed -nr 's#.*:(.*),(.*),(.*)#\3#gp'`
for ip in 7 8 31 41;do
if [ $ip -eq 7 ];then
host_name='web01'
elif [ $ip -eq 8 ];then
host_name='web02'
elif [ $ip -eq 31 ];then
host_name='nfs'
else
		host_name='backup'
fi
echo "---- $host_name info ----"
ssh root@172.16.1.$ip "echo $host_name 总内存: $mem_total"
ssh root@172.16.1.$ip "echo $host_name 可用内存: $mem_ava"
ssh root@172.16.1.$ip "echo $host_name 已使用内存: $mem_used"
ssh root@172.16.1.$ip "echo $host_name swap总大小: $swap_total"
ssh root@172.16.1.$ip "echo $host_name swap可用: $swap_ava"
ssh root@172.16.1.$ip "echo $host_name swap已使用: $swap_used"
ssh root@172.16.1.$ip "echo $host_name /分区总共: $disk_total"
ssh root@172.16.1.$ip "echo $host_name /分区剩余: $disk_ava"
ssh root@172.16.1.$ip "echo $host_name /分区已使用 $disk_used"
ssh root@172.16.1.$ip "echo $host_name 1分钟: $avg_one"
ssh root@172.16.1.$ip "echo $host_name 5分钟: $avg_five"
ssh root@172.16.1.$ip "echo $host_name 15分钟: $avg_fifteen"
done

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值