ssh远程管理
1.远程连接
Linux:
ssh 端口:22 加密传输数据
telnet 端口 23 明文传输数据
Windows:
rdp(remote desktop protocol) 端口 3389
2.抓包演示
Telnet数据明文传输
![]()
ssh密文传输
![]()
3.企业面试题
# 服务对应的端口号
ftp 21
ssh 22
telnet 23
dns 53
mysql 3306
http 80
https 443
rsync 873
4.ssh相关命令及选项
1.ssh:远程连接Linux服务器
选项
-p(port):指定端口
![]()
不连接服务器,直接执行命令:
语法:
ssh 用户@主机地址 '命令'
# 不加用户@,默认使用当前登录的用户
![]()
scp:远程拷贝命令
选项
-r:递归传输文件
-p:拷贝时保持文件的属性
-P:大写P指定端口
语法:
推:scp 源文件 用户@主机ip:目标路径
拉:scp 用户@主机ip:源文件 目标路径
![]()
# 结论
1.scp通过ssh协议加密方法进行文件拷贝
2.scp连接时的用户会作为拷贝文件的属主和属组(可以使用-p保存文件属性)
3.scp支持数据的推和拉,每次都是全量拷贝,效率低
5.ssh免密连接
- ssh密钥对认证流程
![]()
1.使用ssh-keygen命令生成密钥对:
[root@m01 ~]# ssh-keygen
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.
## 这三行都可以不用设置,直接回车
[root@m01 ~]# ll /root/.ssh/
total 8
-rw-------. 1 root root 1675 May 24 16:10 id_rsa
-rw-r--r--. 1 root root 390 May 24 16:10 id_rsa.pub
2.将公钥发送给其他主机:ssh-copy-id
选项
-i:指定公钥位置
![]()
3.传输完成后,会多出一个文件,这个文件里面记录着连接过的服务器,如果是第一次连接,则需要输入yes,如果有在里面记录,则直接连接
![]()
6.免密的过程
1.生成密钥对:ssh-keygen
1.在当前用户的家目录下创建了一个隐藏文件 .ssh (mkdir /.ssh)
2.将密钥对存放的目录授权为700 (chmod 700 ~/.ssh)
3.将公钥的内容写入到 ~/.ssh/id_rsa.pub文件里
4.将私钥的内容写入到~/.ssh/id_rsa文件里
5.将私钥文件授权为600 (chmod 600 ~/.ssh/id_rsa)
2.发送公钥:ssh-copy-id
1.在远端指定用户的家目录下创建了一个隐藏目录 ( ssh 用户@主机IP 'mkdir ~/.ssh')
2.将密钥对的存放目录授权为700 ( ssh 用户@主机IP 'chmod 700 ~/.ssh')
3.在远端.ssh目录下创建一个存放公钥的文件 ( ssh 用户@主机IP 'touch ~/.ssh/authorized_keys')
4.将该文件授权为600 ( ssh 用户@主机IP 'chmod 600 ~/.ssh/authorized_keys')
5.将公钥内容,保存到该文件中 (ssh 用户@主机IP 'ehco 公钥内容' >> ~/.ssh/authorized_keys)
6.免密使用场景
1.批量查看服务器的信息
编写脚本
[root@m01 ~]# vim a.sh
#!/bin/bash[ $# -ne 1 ] && echo "请输入执行的命令" && exit 1
for i in 7 31 41
do
echo "#########172.16.1.$i########"
ssh root@172.16.1.$i "$1"
done
![]()
2.可以用做跳板机
编写脚本
[root@m01 ~]# cat jump.sh
lb01=172.16.1.5
lb02=172.16.1.6
web01=172.16.1.7
web02=172.16.1.8
web03=172.16.1.9
nfs=172.16.1.31
backup=172.16.1.41
db01=172.16.1.51
m01=172.16.1.61
zabbix=172.16.1.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
![]()
7.ssh安全优化
1.创建普通用户
[root@m01 ~]# id jl
uid=1000(jl) gid=10(wheel) groups=10(wheel)
2.在windows生成密钥对
使用windiws的命令行执行
使用xshell
3.使用xshell生成密钥对
![]()
![]()
![]()
![]()
![]()
![]()
![]()
4.生成密钥对后,在用户的家目录下创建.shh目录
mkdir ~/.ssh
5.将该目录授权为700
[jl@m01 ~]# chmod 700 .ssh/
[jl@m01 ~]# ll .ssh -d
drwx------. 2 root root 6 May 24 17:13 .ssh
6.将生成的公钥写入到~/.ssh/authorized.keys中
[jl@m01 ~]# vim ~/.ssh/authorized_keys
1 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA1tRIZp+5MeD5My5RqYj5jTv5qF36y+tvNvfDjpf9sGGwF3I86j/dirKY7d YCnzbaom4SK2X3k3wxAYyujVVWOzAhU5cwlPknU5549KiKQkK65bmnvXIloFAD9JjI/UowORI/XdqjHqG19F4D9iEhff/1 lJB/4O8PWsPLVU7+3maaKMQ39LDoxqxhcR5OdJ0J8pvpkBFo4xZA80FqJKfSq62XL7XzjsW+n/3hvQ7L0djbf4jfw77vIU fBOyqt6oGMdIn4Kd/FAwFALT9hE4v2Jn1zbId5G7lrJGW7ST1AmTveNlhvsi8/0dhMb1YrR4OX9N/h3Udf1ixlwjgsZHBy aw==
6.将该文件授权为600
[jl@m01 ~]# chmod 600 ~/.ssh/authorized_keys
[jl@m01 ~]# ll ~/.ssh/authorized_keys
-rw-------. 1 root root 381 May 24 17:17 /root/.ssh/authorized_keys
7.优化ssh的配置文件
17 Port 29 ## 修改默认端口
38 PermitRootLogin no ## 禁止root用户直接远程登录
65 PasswordAuthentication no ## 禁止使用密码直接远程登录
79 GSSAPIAuthentication no ## 关闭GSSAPI认证
115 UseDNS no ## 关闭反向解析
或将以下内容直接复制到文件的最后一行
Port 29 # 变更SSH服务远程连接端口
PermitRootLogin no # 禁止root用户直接远程登录
PasswordAuthentication no # 禁止使用密码直接远程登录
UseDNS no # 禁止ssh进行dns反向解析,影响ssh连接效率参数
GSSAPIAuthentication no # 禁止GSS认证,减少连接时产生的延迟
8.重启服务
systemctl restart sshd
9.修改这台主机的属性
![]()
![]()
![]()
8.免交互生成密钥对
编写脚本
1.使用expect解决
安装expect:yum install -y expect
[root@m01 ~]# cat expe.sh
#!/usr/bin/expect
set ip 172.16.1.31
set pass 1
set timeout 30
spawn ssh-keygen
expect {
"id_rsa):" {send "\r"; exp_continue}
"passphrase):" {send "\r"; exp_continue}
"again:" {send "\r"}
}
expect eof
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub 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
2.使用sshpass解决
安装 install -y sshpass
[root@m01 ~]# cat send_pub_key.sh
# !/bin/bash
. /etc/init.d/functions
ls -l ~/.ssh/id_sra &>/dev/null|| ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa &>/dev/null
for ip in 7 31 41;do
sshpass -p 1 ssh-copy-id -o 'StrictHostKeyChecking no' -i ~/.ssh/id_rsa.pub root@172.16.1.$ip &>/dev/null
if [ $? -eq 0 ];then
action "172.16.1.$ip send public key " /bin/true
else
action "172.16.1.$ip send public key " /bin/false
fi
done
## ssh-keygen的选项
-t:指定加密类型
-P:设置为空密码
-f:密钥生成的位置
![]()