💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
本人主要分享计算机核心技术:系统维护、数据库、网络安全、自动化运维、容器技术、云计算、人工智能、运维开发、算法结构、物联网、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 ~]#
#连接成功