远程连接
Linux:
  - ssh 端口:22 加密传输数据
  - telnet 端口:23 明文传输数据
  
Windows:
  - rdp 端口:3389 remote desktop protocol抓包演示
SSH数据加密传输

Telnet数据明文传输

企业面试题
## 写出下列服务或者协议的端口
ftp          21
ssh          22
telnet       23
dns        53 
mysql        3306 
http       80 
https      443 
rsync      873ssh相关命令及选项
## 注意:不加用户@,默认使用当前登录的用户
ssh:远程连接Linux服务器
-p:port指定端口
## 不连接上服务器,直接执行命令
ssh root@10.0.0.41 'ls /'     (其实是连接了服务器,只不过是执行完命令,又快速断开了)
scp:远程拷贝数据(写在前面的是源文件)
-r:递归(远程拷贝目录)
-p:拷贝的时候保持属性
-P:大写p指定port
推:scp sersync2.5.4 root@172.16.1.7:/root
拉:scp root@172.16.1.7:/root/sersync2.5.4 /opt
[root@backup ~]# scp -P 22 root@172.16.1.7:/root/sersync2.5.4.tar.gz .
# 结论:
1.scp通过ssh协议加密方式进行文件或目录拷贝。
2.scp连接时的用户作为为拷贝文件或目录的权限。(-p保持文件属性,-a)
3.scp支持数据推送和拉取,每次都是全量拷贝,效率较低ssh免密连接
验证方式:
- 用户名密码验证
 - 密钥对验证方式
 

#### ssh-keygen:生成密钥对
[root@m01 ~]# ssh-keygen
Generating public/private rsa key pair.
## 将秘钥保存到文件中,可以指定其他路径(直接回车)
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
## 给密钥对设置密码,不需要设置(直接回车)
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:3jXcLjP2VzFk55xY7lYGdohVQSSxxBJLDJE9MJIUWbU root@m01
The key's randomart image is:
+---[RSA 2048]----+
|      .+=*O+o*=*o|
|       o..o==.*+o|
|           Eoo*=o|
|           . o ==|
|          S + o.+|
|       . . . o o.|
|        . . = o .|
|            . = .|
|              .. |
+----[SHA256]-----+
## 生成后的密钥对
[root@m01 ~]# ll /root/.ssh/
-rw------- 1 root root 1679 May 23 11:29 id_rsa
-rw-r--r-- 1 root root 390 May 23 11:29 id_rsa.pub
#### ssh-copy-id:发送公钥
-i:指定公钥位置
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.7
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.8
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.31
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.41
#### .ssh目录中的know_host作用
[root@m01 ~]# cat ~/.ssh/known_hosts
记录连接过的服务器,如果没有连接过(第一次连接),需要输入yes
-------------------------------
#以下是 生成步骤
#### 生成密钥对命令:ssh-keygen
1.在当前用户的家目录下创建了一个隐藏目录    .ssh mkdir ~/.ssh
2.将密钥对存放目录                 .ssh 授权为 700 chmod 700 ~/.ssh
3.将公钥内容写入 ~/.ssh/id_rsa.pub 文件中
4.将私钥内容写入 ~/.ssh/id_rsa 文件中
5.将私钥文件授权为 600            chmod 600 ~/.ssh/id_rsa
#### 发送公钥:ssh-copy-id
[root@web01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.5 
输入yes
输入密码:1
1.在远端的指定用户的家目录下创建了一个隐藏目录.ssh  ssh root@172.16.1.5 'mkdir ~/.ssh'
2.将密钥对存放目录 .ssh 授权为 700         ssh root@172.16.1.5 'chmod 700 ~/.ssh'
3.先在远端~/.ssh目录下创建文件authorized_keys     ssh root@172.16.1.5 'touch ~/.ssh/authorized_keys'
4.将authorized_keys文件授权为600                ssh root@172.16.1.5 'chmod 600 ~/.ssh/authorized_keys'
5.将公钥内容,保存到authorized_keys文件中
ssh root@172.16.1.5 'echo ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCgW5rliyT3oan+r4aXuOj0D0fL
EFSGNJXZd5JMDYWX2pWhC5kITeVS66+EvXM 5OvqFfr40IQcMrZym0DXk7Zqf8brgWoqxR8AZR9tqAFwV3qTb9T/QB
95OM16Y+N14oUOvWCzB9rQo54QU/INPgfhaRy Sk4YOgv+oL2aXdD6qbIGAikPzayvh9hWFjvy/LeFUGLheYYlYTqV
M7WgeNrTlmbpjG4QO/IYe/xWESbt20l70yTIrD/ XWSZ2lsxSWQf0KXERhshRGhNkJF87hhS2cJozOHjzhjaPjDvgy
cjpYajQWf4gERe3sTL9fji/bhf8bZ3dCLp4uK/e5P 6CRpgo9V root@web01' >> ~/.ssh/authorized_keys'免密使用场景
1.批量查看服务器信息
[root@m01 ~]# cat check_host.sh 
[ $# -ne 1 ] && echo "请输入执行的命令" && exit 1
for i in  7 8 31 41
do
    echo "#########172.16.1.$i#####"
    ssh root@172.16.1.$i "$1"
done2.跳板机
[root@m01 ~]# cat jump.sh
#!/bin/bash
#jumpserver 
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 
doneSSH安全优化
## ssh配置文件
[root@m01 ~]# vim /etc/ssh/sshd_config
 17 Port 22         # 修改默认端口(为了安全,默认端口谁都会知道,1-65535之间,别用一些默认端口就行)
 
 115 UseDNS no        # 关闭反向解析(IP解析成域名叫做反向解析)
 38 PermitRootLogin no         # 禁止root用户登录
 65 PasswordAuthentication no  # 禁止使用密码登录
 79 GSSAPIAuthentication no      # 关闭GSSAPI认证
 
 ## 将以下内容,直接复制到文件最后一行
Port 6666                       # 变更SSH服务远程连接端口
PermitRootLogin         no      # 禁止root用户直接远程登录
PasswordAuthentication  no      # 禁止使用密码直接远程登录
UseDNS                  no      # 禁止ssh进行dns反向解析,影响ssh连接效率参数
GSSAPIAuthentication    no      # 禁止GSS认证,减少连接时产生的延迟 
## 重启服务
[root@m01 ~]# systemctl restart sshd
## 解决方案
如果已经优化完ssh,发现服务器上出现以下问题:
1.没有普通用户
useradd zls(无法创建,进入单用户模式)
2.windows上秘钥没有推送
1)在windows上生成密钥对
  - 使用windows的命令行执行 ssh-keygen
  - 使用Xshell
2)使用Xshell生成密钥对
生成密钥对





密码可加可不加


#在单用户模式中把使用密码yes,才能xshell登录普通用户,建议在该配置文件时提前先弄好下面的步骤,再把使用密码NO了
[zls@m01 ~]$ mkdir .ssh
[zls@m01 ~]$ chmod 700 .ssh
[zls@m01 ~]$ vim .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA4wlDUthr7U8H07DOcGQuuijuqIYKjKFSqhYdUiRJzGsMg7myvON+YE
QshomQVVGfoGPmJLbqawHy3tAoOTEJkdmMx9QLtCS4IwCaGjZ/gIVJ/iL+YqC8/FGsAFtHLRcVAEy5FSktP31uXT1a
ctRkwJSUPHsZyvpNJma+DSDhdRQ1sqT4HjBZBFzOuNKaFRi53Fp53CnrXVcwttWcjEjssVbxWkhqhjiBWbw7i1GHX1e
QoPNI2+IQbr8AZ96byHGMM2GkAtDJpyIdZZihx5Dc31gcVu37kvmtvD2ZtxJivmbVF1WEBf8zEgCTQsnA7hVq0GTSA
NN2vEI50AM4c9Yauw==
[zls@m01 ~]$ chmod 600 .ssh/authorized_keys

完成即可密钥登录普通用户
免交互生成密钥对
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa &>/dev/null
-t:指定加密类型
-P:空密码
-f:秘钥生成的位置 (就是跳过了四次空格)免交互推送公钥
## 不会循环的lowB写法
ls -l ~/.ssh/id_rsa &>/dev/null || ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa &>/dev/null
ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.31
ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.41
ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.5
ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.7
ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.8
## 循环
ls -l ~/.ssh/id_rsa &>/dev/null || ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa &>/dev/null
for n in `cat /root/1.txt`;do
  ssh-copy-id -i ~/.ssh/id_rsa.pub root@$n
done
-------------------------------------------------------------------------------------
## 解决密码交互问题
1)使用expect解决
[root@m01 ~]# yum install -y 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解决
[root@m01 ~]# yum install -y sshpass
## ssh不需要输入yes的选项
[root@m01 ~]# ssh -o 'StrictHostKeyChecking no' root@172.16.1.7
[root@m01 ~]# sshpass -p 1 ssh-copy-id -o 'StrictHostKeyChecking no' -i ~/.ssh/id_rsa.pub root@172.16.1.8
[root@m01 ~]# cat send_public_key.sh
ls -l ~/.ssh/id_rsa &>/dev/null || ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa &>/dev/null
for n in `cat /root/1.txt`;do
   shpass -p 1 ssh-copy-id -o 'StrictHostKeyChecking no' -i ~/.ssh/id_rsa.pub root@$ip
done
[root@m01 ~]# cat /root/1.txt
172.16.1.31
172.16.1.41
172.16.1.5
172.16.1.7 
172.16.1.8
## 密码不一致的情况
ls -l ~/.ssh/id_rsa &>/dev/null || ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa &>/dev/null
for n in `cat /root/1.txt`;do
  pass=`echo $n|awk -F ':' '{print $2}'`
  ip=`echo $n|awk -F ':' '{print $1}'`
   sshpass -p $pass ssh-copy-id -o 'StrictHostKeyChecking no' -i ~/.ssh/id_rsa.pub root@$ip
done
[root@m01 ~]# cat /root/1.txt
172.16.1.31:1
172.16.1.41:2 
172.16.1.5:3
172.16.1.7:4
172.16.1.8:111
## 优化后的脚本
vim send_public_key.sh
. /etc/init.d/functions
ls -l ~/.ssh/id_rsa &>/dev/null || ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa &>/dev/null
for n in `cat /root/1.txt`;do
  pass=`echo $n|awk -F ':' '{print $2}'`
  ip=`echo $n|awk -F ':' '{print $1}'`
  sshpass -p $pass ssh-copy-id -o 'StrictHostKeyChecking no' -i ~/.ssh/id_rsa.pub root@$ip &>/dev/null
  if [ $? -eq 0 ];then
   action "$ip send public key " /bin/true
  else
   action "$ip send public key " /bin/false
 fi
done
## 优化后不使用判断的脚本
. /etc/init.d/functions
ls -l ~/.ssh/id_rsa &>/dev/null || ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa &>/dev/null
for n in `cat /root/1.txt`;do
   pass=`echo $n|awk -F ':' '{print $2}'`
   ip=`echo $n|awk -F ':' '{print $1}'`
   sshpass -p $pass ssh-copy-id -o 'StrictHostKeyChecking no' -i ~/.ssh/id_rsa.pub root@$ip &>/dev/null && \
   action "$ip send public key " /bin/true || \
   action "$ip send public key " /bin/false
1d one









