Linux基础29 ssh, telnet, scp命令, sftp命令, ssh连接方式(免密登录实践)

发布时间 2023-07-21 18:49:40作者: 战斗小人

SSH远程管理服务

SSH是一个安全协议,在进行数据传输时,会对数据包进行加密处理,加密后再进行数据传输。确保了数据传输安全。那SSH服务主要功能有哪些呢?
1.提供远程连接服务器的服务
    linux远程连接协议:ssh    22    telnet 23
    windows远程连接协议:RDP(remote desktop) 3389
2.对传输进行加密
面试题:请说明下列服务都是哪些端口?
ssh    22
telnet    23
http    80
https    443
ftp    20   21(一个上传,一个下载)
RDP    3389
mysql    3306
dns        53
zabbix    10051  10050
elasticsearch    9200  9300
pop3    110
rpcbind    111
rsync    873
redis    6379

 

ssh和telnet

1.使用telnet连接服务器

# 1.安装telnet
[root@nfs ~]# yum install -y telnet-server

# 2.启动telnet
[root@nfs ~]# systemctl start telnet.socket

# telnet不支持root用户,只支持普通用户
# 3.创建普通用户
[root@nfs ~]# useradd lhd
[root@nfs ~]# echo 123 | passwd --stdin lhd        # 设置密码

# 4.验证登录
telnet 10.0.0.31 23    # 或者使用xshell的telnet连接方式连接

2.ssh和telnet区别

telnet:
    1.不支持root直接登录,只能用普通用户
    2.数据传递是明文的
    
ssh:
    1.支持root直接登录
    2.所有数据传递都是加密的

 

3.scp命令(远程文件传输)

scp客户端命令:远程拷贝
scp类似rsync
scp全量        rsync增量

# scp支持推和拉
# 推: 将本地的/data目录推送到backup服务器的/tmp目录下
[root@nfs ~]# scp -r /data/ root@172.16.1.41:/tmp/
# 推: 将本地的/data目录下的文件推送到backup服务器的/tmp目录下
[root@nfs ~]# scp -r /data/* root@172.16.1.41:/tmp/

# 拉: 将远端172.16.1.41服务器的/data目录拉取到本地的/tmp目录下
[root@nfs tmp]# scp -r root@172.16.1.41:/data /tmp/

-P    指定端口,默认是22    (基于ssh协议)
-p    保持传输文件属性不变
-r    表示递归拷贝目录
-l    限速

# -l 限速        单位是  kb
[root@nfs tmp]# scp file root@172.16.1.41:/backup/
root@172.16.1.41's password:
file    46%    234MB    14.5MB/s    00:18

# 设置速度为10M    10*1024*8=81920(换算成kb)
[root@nfs tmp]# scp -l 81920 file root@172.16.1.41:/backup/

 

sftp命令

基于SSH协议,默认端口22

# 文件传输命令
[root@web01 ~]# sftp root@10.0.0.31
# 查看连接后服务器
sftp> ls
# 查看本地服务器
sftp> lls

#命令        远端服务器文件  本地服务器位置
sftp> get 1_nfs.gif ./
#命令        本地服务器文件  远程服务器位置
sftp> put /data/1_nfs.gif /tmp/

# 图形界面:    Xftp FileZilla    FlashFXP

sftp:
    1.能上传文件夹
    2.能支持断点续传
    3.支持上传大于4G的文件
    
rz:
    1.不能上传文件夹
    2.不支持断点续传
    3.只能上传小于4G的文件

 

SSH验证远程登录

1.方式一:基于账户密码的方式远程登录

#需要知道服务器的IP,端口,账户,密码,才可以通过ssh客户端连接远程主机
[root@web01 ~]# ssh -p 22 root@172.16.1.31    # 一般企业里端口不会用22

# 密码设置条件
1.复杂的密码: yonghu_id_ip_sysnum(类似这种记不住)
2.简单的密码: 容易被破解
3.每台服务器密码不一样
4.密码三个月更换一次
5.输入密码错误三次自动锁死
6.密码有key,30秒一变或者1分钟一变

2.秘钥

默认情况下,通过ssh客户端命令登录远程服务器,需要提供远程系统上的账号与密码,但为了降低密码泄露的几率和提高登录的方便性,建议使用秘钥验证方式。

1)生成密钥对

-t        指定秘钥类型    rsa        dsa
-C        指定用户邮箱
[root@m01 ~]# ssh-keygen            # 一直回车即可(windows上也是可以生成密钥对的)
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:JOpKBOMhaCCJzjpctZcopaHwaMMfqIBJSMAmlvkRVsw root@m01
The key's randomart image is:
+---[RSA 2048]----+
|Xooo=.           |
|XB.o E           |
|/*+ * + o        |
|O@o* + =         |
|*.= + . S        |
|+o o             |
| .. .            |
| . .             |
|  .              |
+----[SHA256]-----+
[root@m01 ~]# 

 

2) 推送公钥到要免密连接的服务器

# 方式一:手动复制公钥
m01管理机操作
[root@m01 .ssh]# cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCqI3wyeRp47NiTEdO61r1WfaVr/bKESf70q52lLYZ1p00TAF9uTW4FMNloR8mLWJ720djQwUs4TWA5w4oy91aD0p+jwVyIf1PEq9VX+5UX5rsl2e4eLsyclPm+SIyfMtvWJqLw8PTJsS9HR41n1LpF7YhgmElnQPzraIVz7l9oxSrWyzCn6/NjM/PSVuqxrdeIv7Q8Jd18PB9yVXBA+2XMGV1u5cnxqdHlnweteVbywv5UhWsuEZtV4XzEs1KRPbkrALErYF/NEWSfDdGqLK4/4i9Rec28XQb+q5ggu24+DQDkkSh/CgqRxq2gvs5PNXlM2RR4K3QJOg7D2ZxLsHAh root@m01

# 把公钥复制到要连接的服务器web01
web01服务器操作
# 到web01下看是否有.ssh文件夹,没有就创建并赋权700
[root@web01 ~]# mkdir .ssh/
[root@web01 ~]# chmod 700 .ssh    # 如果.ssh是手动创建的,要给700权限

[root@web01 ~]# vim .ssh/authorized_keys    # 注意:保证写入的是一行内容
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCqI3wyeRp47NiTEdO61r1WfaVr/bKESf70q52lLYZ1p00TAF9uTW4FMNloR8mLWJ720djQwUs4TWA5w4oy91aD0p+jwVyIf1PEq9VX+5UX5rsl2e4eLsyclPm+SIyfMtvWJqLw8PTJsS9HR41n1LpF7YhgmElnQPzraIVz7l9oxSrWyzCn6/NjM/PSVuqxrdeIv7Q8Jd18PB9yVXBA+2XMGV1u5cnxqdHlnweteVbywv5UhWsuEZtV4XzEs1KRPbkrALErYF/NEWSfDdGqLK4/4i9Rec28XQb+q5ggu24+DQDkkSh/CgqRxq2gvs5PNXlM2RR4K3QJOg7D2ZxLsHAh root@m01
# 授权
[root@web01 ~]# chmod 600 .ssh/authorized_keys

# m01即可免密登录。注意: 必须授权,不授权就无法免密登录
# 方式二:命令推送公钥
[root@m01 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@172.16.1.31
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: ".ssh/id_rsa.pub"
The authenticity of host '172.16.1.31 (172.16.1.31)' can't be established.
ECDSA key fingerprint is SHA256:2SQdzwgUOhQNWwPZEZSV9NaJ2i3tS2GgUaCazKOyOew.
ECDSA key fingerprint is MD5:24:68:a9:38:f3:00:b4:7b:8a:72:0f:2a:c9:77:82:e0.
Are you sure you want to continue connecting (yes/no)? yes
/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@172.16.1.31's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@172.16.1.31'"
and check to make sure that only the key(s) you wanted were added.

# m01即可免密登录。注意: 该方式推送,对方服务器.ssh和authorized_keys已赋权

[root@nfs ~]#
[root@m01 ~]# ssh 172.16.1.31    # 免密登录
Last login: Fri Jul 21 23:49:07 2023 from 10.0.0.1

 

3)免密登录可以帮我们做巡检

[root@m01 ~]# vim xunjian.sh
--------------------------
#!/bin/bash
[ $# -ne 1 ] && echo "请输入执行的命令" && exit 1
for i in 31 41 7
do
        echo "#####172.16.1.$i#####"
        ssh root@172.16.1.$i "$1"
done
--------------------------

[root@m01 ~]# sh xunjian.sh "df -h"

 

SSH免密场景

实践场景,用户通过windows/MAC/Linux客户端连接跳板机免密码登录,跳板机连接后端无外网的Linux主机实现免密登录,架构图如下。
实践多用户登录一台服务器无密码
实践单用户登录多台服务器免密码

 

windows下的powershell也可以,这里展示xshell的制作过程

1.windows使用xshell生成密钥对

1)xshell-->工具-->新建用户秘钥生成向导(相当于ssh-keygen生成秘钥)

2) 生成秘钥对(秘钥类型随意,秘钥长度随意)

3) 创建秘钥名字,不需要给秘钥创建密码(如果有,使用秘钥还要询问密码)

 确定(不用管密码是空的)

4)查看秘钥对的公钥

点击属性

 获取公钥,可以复制,也可以导出成文件

5)将公钥复制到m01机器

# 在m01管理机上,创建公钥(和上方一样,没有.ssh文件夹就创建并赋权)
[root@nfs .ssh]# vim authorized_keys
[root@nfs .ssh]# chmod 600 authorized_keys

xshell通过秘钥的方式连接跳板机