Linux之ssh和scp(SSH and SCP in Linux)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

本人主要分享计算机核心技术:系统维护、数据库、网络安全、自动化运维、容器技术、云计算、人工智能、运维开发、算法结构、物联网、JAVA 、Python、PHP、C、C++等。
不同类型针对性训练,提升逻辑思维,剑指大厂,非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。

Linux之ssh和scp

ssh和scp两种基于ssh协议的技术,用于在不安全网络中安全地传输数据和文件。‌总的来说,SSH‌主要用于远程登录和执行命令,而‌SCP‌专注于在本地主机和远程主机之间安全地传输文件。两者都基于SSH协议,提供了数据传输的安全性和加密功能,确保在传输过程中文件内容的机密性和完整性‌。

目录

一、SSH介绍

二、SSH相关常用文件

三、SSH常用命令

四、SSH实验 

4.1、远程连接MobaXterm、Xshell

4.2、SCP介绍、文件传输工具

4.3 、SFTP:安全的文件传输协议

4.4、SSH密钥对认证 :ssh-keygen

一、SSH介绍

SSH(Secure Shell)是一种网络协议,用于在两个网络设备之间建立加密的、安全的连接。它被广泛用于远程管理、文件传输、VPN(Virtual Private Network)和数据存储等领域。

SSH协议主要包括两个组件:SSH客户端和SSH服务器。当您使用SSH客户端连接到一个SSH服务器时,客户端和服务器之间会建立一个安全的、加密的连接。这意味着,通过这个连接传输的所有数据都是加密的,包括用户名和密码等敏感信息。

SSH协议也支持公钥认证,这种认证方式比基于密码的认证更加安全。在公钥认证中,需要先在本地计算机上生成一个公钥和私钥,然后将公钥复制到远程服务器上。当尝试通过SSH连接到远程服务器时,服务器会检查提供的公钥是否与其存储在文件中的公钥匹配。如果匹配,则计算机将被允许登录到服务器。
二、SSH相关常用文件

2.1、/etc/ssh/sshd_config:配置SSH服务端,用于设置SSH服务器的各种参数和行为,例如监听的端口、允许登录的用户、认证方式、密码策略等。

2.2、/etc/ssh/ssh_config:配置SSH客户端,用于设置SSH客户端的行为和连接选项,例如默认使用的认证方式、连接超时时间、代理设置等。
 

    /etc/ssh/sshd_config常见参数:

    Port: 该参数指定SSH服务器监听的端口号。默认情况下,SSH服务器监听22端口,但是可以通过修改Port参数来指定其他端口号。

    ListenAddress: 该参数指定SSH服务器监听的网络地址。默认情况下,SSH服务器会在所有网络接口上监听连接请求。但是可以使用ListenAddress参数来指定监听某个特定的网络接口。

2.3、~/.ssh/id_rsa:存放基于 RSA 算法的 SSH 私钥的默认路径,通常情况下,私钥文件应该具有严格的访问权限,只有拥有者可以读取和写入该文件,以保证私钥不被恶意获取。(如果是基于其他算法,例如基于ecdsa算法,那么私钥文件为~/.ssh/id_ecdsa)

2.4、~/.ssh/id_rsa.pub:存放基于 RSA 算法 SSH 公钥的文件路径,公钥文件是可以公开和共享的,可以在需要进行 SSH 公钥认证的场景下提供给其他人或系统管理员。(如果是基于其他算法,例如基于ecdsa算法,那么私钥文件为~/.ssh/id_ecdsa.pub)
三、SSH常用命令

ssh: 这是最基本的SSH命令,用于建立与远程服务器的安全连接。

    ssh user@hostname        #user是登录远程服务器的用户名,hostname是远程服务器的主机名或IP地址

ssh-keygen: 用于生成SSH密钥对(公钥和私钥)。

    ssh-keygen -t rsa         #将生成一个RSA密钥对

ssh-copy-id: 将本地公钥复制到远程服务器,以实现无密码登录。

    ssh-copy-id user@hostname         #这将将本地公钥复制到远程服务器上的用户目录下的~/.ssh/authorized_keys文件中。

scp: 用于在本地计算机和远程服务器之间复制文件。

    scp local_file user@hostname:remote_location        #将本地文件复制到远程服务器 

    scp user@hostname:remote_file local_location        #将远程服务器上的文件复制到本地计算机

ssh-add: 将私钥添加到ssh-agent,以便在使用SSH时免去输入密码。

    ssh-add ~/.ssh/id_rsa         #将id_rsa私钥添加到ssh-agent中

ssh-agent: SSH代理,用于管理和使用SSH私钥。

ssh-keyscan: 用于获取远程服务器的公钥。

    ssh-keyscan hostname 

四、SSH实验 

实验环境:虚拟机1(服务端):172.16.80.51

                  虚拟机2(客户端):172.16.80.12

实验前准备:(关闭防火墙,改ssh端口)

两台虚拟机关闭防火墙,降低安全机制

    [root@51 ~]# setenforce 0
    [root@51 ~]# systemctl stop firewalld
     
    [root@12 ~]# systemctl stop firewalld
    [root@12 ~]# setenforce 0

修改虚拟机1的配置文件

    #修改虚拟机1的配置文件,即将修改端口号和监听的地址
    [root@51 ~]# vim /etc/ssh/sshd_config

 配置文件中17到20行如下

    解释:

    1、Port 22:这是SSH服务器监听的端口号。默认情况下,SSH服务器使用端口22进行通信。您可以根据需要更改此端口号,以增加安全性或避免冲突。
    2、AddressFamily any:此配置指定SSH服务器将接受来自任何地址家族(IPv4或IPv6)的连接请求。
    3、ListenAddress 0.0.0.0:此配置指定SSH服务器应该监听的IPv4地址。在这种情况下,服务器将监听所有可用的IPv4地址。
    4、ListenAddress :: :此配置指定SSH服务器应该监听的IPv6地址。在这种情况下,服务器将监听所有可用的IPv6地址。

 改成如下所示

为了增强安全性,更改端口号。 
4.1、远程连接MobaXterm、Xshell

MobaXterm和Xshell都是基于SSH协议的远程终端工具,现在虚拟机1的ssh端口号更改,远程登录时需要注意端口号。

MobaXterm的连接:

Xshell的连接:

 主机(H)为本机IP地址

端口号改为ssh配置的端口号

虚拟机2(172.16.80.12) 连接 虚拟机1(172.16.80.51)

    [root@12 ~]# ssh -p 10022 root@172.16.80.51
    The authenticity of host '[172.16.80.51]:10022 ([172.16.80.51]:10022)' can't be established.
    ECDSA key fingerprint is SHA256:nzXoq4mASEAi8y0Gzz5qMg3FZct/JGPcq7WZI6zzmeQ.
    ECDSA key fingerprint is MD5:39:16:e6:c5:55:5e:49:aa:df:18:35:93:22:16:a2:0b.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '[172.16.80.51]:10022' (ECDSA) to the list of known hosts.
    root@172.16.80.51's password:
    Last login: Thu Jan 25 01:54:18 2024 from 172.16.80.1
    [root@51 ~]# cd /opt
    [root@51 opt]# ls
    compose_lnmp  containerd  mysql  nginx  php  playbooks  rh  xxtg01
    [root@51 opt]# touch test01.txt
    [root@51 opt]# ls
    compose_lnmp  containerd  mysql  nginx  php  playbooks  rh  test01.txt  xxtg01
    [root@51 opt]# exit
    logout
    Connection to 172.16.80.51 closed.

    ssh -p 10022 root@172.16.80.51 命令解析:

    1、ssh:表示要使用 SSH 协议进行连接。

    2、-p 10022:指定了要连接的远程服务器的端口号为 10022。默认情况下,SSH 默认端口是22。

    3、root:是要登录到远程服务器的用户名。

    4、172.16.80.51:目标 Linux 服务器的 IP 地址。

    5、输入完这个命令回车后,在它所问的‘Are you sure you want to continue connecting (yes/no)?’后面输入 yes,在‘root@172.16.80.51's password:’后面输入 虚拟机1的root用户密码。

    6、此时 虚拟机2 可以以root用户的身份操作 虚拟机1 了,用exit命令退出远程连接。

4.2、SCP:文件传输工具
1.介绍

‌SCP(Secure Copy)‌是基于SSH协议的文件传输工具,用于在本地主机和远程主机之间安全地传输文件。SCP支持三种主要的复制操作:从本地复制到远程、从远程复制到本地、以及两个远程系统之间的复制。在使用SCP传输数据时,文件和密码都是加密的,不会泄漏敏感信息。SCP的语法类似于CP命令,支持一次复制多个文件,并且在目标位置已经存在同名文件的情况下,SCP会在没有警告的情况下覆盖这些文件‌。

  2.  scp用法:

    从远程服务器复制文件到本地:scp user@remote_host:/remote/file.txt /local/directory/

    从本地复制文件到远程服务器:scp local_file.txt user@remote_host:/remote/directory/

复制文件: 

    [root@12 opt]# scp -P10022 root@172.16.80.51:/opt/test01.txt /opt/
    root@172.16.80.51's password:
    test01.txt                                                                             100%    0     0.0KB/s   00:00
    [root@12 opt]# ls
    rh  share  test01.txt

    scp -P10022 root@172.16.80.51:/opt/test01.txt /opt/ :从远程服务器上用户 root 的主目录下的 /opt/ 目录中的 test01.txt 文件复制到本地计算机的 /opt/ 目录中,并且使用的 SSH 端口号是 10022(如果是22端口可以不用输入-P22)。

 复制目录:

[root@12 opt]# scp -rP 10022 root@172.16.80.51:/opt/123 /opt/

    -r:表示递归复制整个目录。

4.3 、SFTP:安全的文件传输协议

    SFTP(Secure File Transfer Protocol)是一种安全的文件传输协议,用于在本地计算机和远程服务器之间进行安全的文件传输和管理。SFTP相比于FTP具有更高的安全性,传输速度比普通FTP要慢,语法和FTP一样。

Windows系统中,win键+R键,输入cmd打开命令行界面,输入‘sftp -P 10022 root@172.16.80.51’进行连接。

    C:\Users\Administrator>sftp -P 10022 root@172.16.80.51
    root@172.16.80.51's password:
    Connected to 172.16.80.51.
    sftp> cd /opt
    sftp> ls
    123            compose_lnmp   containerd     mysql          nginx          php            playbooks      rh             
    test01.txt     xxtg01
    sftp> get test01.txt
    Fetching /opt/test01.txt to test01.txt
    /opt/test01.txt                                                                       100%    6     2.8KB/s   00:00
    sftp> put hello.txt
    Uploading hello.txt to /opt/hello.txt
    hello.txt                                                                             100%   11     0.0KB/s   00:00

get test01.txt会将远程主机的当前目录下的test01.txt传输到本机的C:\Users\Administrator目录下。

put hello.txt会将hello.txt文件从本机的C:\Users\Administrator目录传输到远程主机的当前目录下。

4.4、SSH密钥对认证 :ssh-keygen

SSH密钥对使用了两个不同的密钥:一个是公钥,另一个是私钥。公钥可以在网络上自由传播,而私钥必须被妥善保管。在 SSH 密钥对认证中,本地计算机和远程主机都有一对密钥。本地计算机会将公钥发送到远程主机。远程主机将公钥添加到其授权密钥文件中,并将其与本地的用户名进行关联。随后,远程主机会向本地计算机发送一个随机的挑战字符串。本地计算机使用私钥对该字符串进行加密,并将加密结果发送回远程主机。如果远程主机能够使用已保存的公钥成功解密加密结果,并且解密结果等于挑战字符串,则身份验证成功。

简单总结:私钥通常存储在用户本地计算机上,并且必须得到妥善保护。公钥可以自由传播,用于将其添加到其他计算机上的授权密钥文件,以实现使用私钥进行身份认证。SSH 密钥对认证,更高的安全性,免去密码输入。

ssh-keygen的常见参数:
t    指定密钥类型,可选值包括 rsa、dsa、ecdsa 和 ed25519 等
b    指定密钥长度,单位为比特。默认值为 2048(RSA 密钥)或 256(ECDSA 和 Ed25519 密钥)
c    为生成的密钥添加注释,通常用于标识密钥所属的用户或用途
f    指定生成的密钥文件名和路径。

 ssh-keygen常用的非对称加密算法:rsa、dsa、ecdsa。ssh-keygen中的-t参数指定算法。密钥公钥路径在~/.ssh/路径下。私钥文件一般为 ~/.ssh/id_算法缩写 (例如:~/.ssh/id_rsa),公钥文件一般为 ~/.ssh/id_算法缩写.pub (例如:~/.ssh/id_rsa.pub)。

以ECDSA密钥类型举例:

    #在虚拟机1(172.16.80.51)中生成 ECDSA 类型的密钥对,输入命令:ssh-keygen -t ecdsa
    [root@51 ~]# ssh-keygen -t ecdsa
    Generating public/private ecdsa key pair.
    Enter file in which to save the key (/root/.ssh/id_ecdsa):
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /root/.ssh/id_ecdsa.
    Your public key has been saved in /root/.ssh/id_ecdsa.pub.
    The key fingerprint is:
    SHA256:rs3LZRr41ykdY5WMaAyo1R1vmBpO8v+kwIDV/7uA28k root@51
    The key's randomart image is:
    +---[ECDSA 256]---+
    |       o ...     |
    |      o.o .+     |
    |     oo +oo.oo . |
    |    .o = ++.. +  |
    |    . . S..  .   |
    |       = o .+    |
    |      . * =+o+   |
    |       * Xo*+.   |
    |      . OoE.+.   |
    +----[SHA256]-----+
    # ~/.ssh/ 目录下生成了密钥,公钥:id_ecdsa,私钥:id_ecdsa.pub
    [root@51 ~]# ls ~/.ssh/
    id_ecdsa  id_ecdsa.pub  id_rsa  id_rsa.pub  known_hosts
    #传输公钥,使用 ssh-copy-id 命令
    [root@51 ~]# ssh-copy-id -i ~/.ssh/id_ecdsa root@172.16.80.12
    /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_ecdsa.pub"
    /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
    Number of key(s) added: 1
    Now try logging into the machine, with:   "ssh 'root@172.16.80.12'"
    and check to make sure that only the key(s) you wanted were added.
    #启动新bash子进程,将 SSH 私钥添加到 ssh-agent 代理中
    [root@51 ~]# ssh-agent bash
    [root@51 ~]# ssh-add
    Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)
    Identity added: /root/.ssh/id_ecdsa (/root/.ssh/id_ecdsa)
    #验证:连接虚拟机2
    [root@51 ~]# ssh root@172.16.80.12
    Last login: Sun Jan 28 01:31:01 2024 from 172.16.80.1
    [root@12 ~]#
    #连接成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linux运维老纪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值