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 no | GSS 认证功能关闭 |
安全优化项目 | |
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