网络客户端
curl 工具,查看网页源码以及下载文件
curl命令默认查看的是网络的源码
curl yutianedu.com
curl -I yutianedu.com
curl -x socks://代理ip:端口 访问的网址
使用代理去访问。对面的机器留下的是代理服务器的IP 而不是你自己本身的IP
Server:表示的是服务器以及运行的web软件
http状态码
200 ok 表示正常访问
301 网址重定向
403 权限拒绝
文件权限不够,SELinux拒绝访问
404 资源不存在,网页文件丢失
502 网关错误 一般都是开发着写的脚本代码有问题 php java
curl下载文件
curl -O 文件地址
默认下载到当前路径
curl -o 路径/文件 文件地址
下载到指定路径下并且修改名字
从ftp服务器上下载文件,ftp需要验证用户名和密码
curl -O -u 用户名:密码 文件地址
curl -O ftp://用户名:密码@文件地址
wget下载文件
专业的下载工具,天生支持文件的下载
wget 文件地址
默认下载到当前路径
wget -P 路径 文件地址
将文件下载到指定路径
wget -O 文件名 文件地址
如果不想下载文件 只想测试是否能够下载
wget --spider 文件地址
通过查看状态码来判断是否能正常下载
如果下载文件高达 GB级别。下载的时间会很长,还会占据你的终端界面!!!!!!
wget -b 文件地址
远程访问Linux系统-使用ssh
管理Linux系统的时候,有多种方式:
通过显示屏,图形化 ,通过hdmi vga线连接到服务器的接口上
缺点:必须要面对面服务器才可以看到页面
好处:不需要有网络就可以操作系统
通过网络管理Linux系统—>只要有网络 就可以连接到Linux系统上
好处:只有要网 就可以进行管理系统
缺点:如果你的系统没有网络的话,无法进行远程管理
怎么通过网络进行管理登录系统????
windows系统通过rdp远程桌面管理windows系统
Linux系统通过ssh 安全套接字协议 进行远程登录
ssh
ssh是一个服务,也是一个协议,也是一个远程工具
ssh服务由openssh软件包提供
openssh-client 客户端
openssh-server 服务端
C/S 架构。C 客户端 , S 服务端
B/S架构。B 浏览器,S 服务端
Linux系统默认已经安装了 openssh套件(openssh-client和openssh-server),RHEL centos openeuler
如果客户端要ssh连接到服务端,远程的服务端必须要用openssh-server软件包
ssh只是openssh-client提供的其中一个命令
远程连接:
在RHEL9中,无法直接ssh登录到系统的root用户
在Linux系统上实现ssh远程登录
ssh 用户名@远程主机IP地址 (远程登录Linux系统)
主机IP地址可以替换为 主机名,但是必须要做域名解析
远程登录的用户必须要设置密码!!!!!!
ssh 用户名@远程主机IP地址 执行命令
不需要登录远程主机即可实现操作
ssh -X 用户名@远程主机IP地址
调用X11图形化转发协议,支持远程打开图形化软件等!!
在windows系统上实现ssh远程登录到Linux系统
从win10开始,系统默认已经安装了openssh-client软件包,提供了ssh工具
如果windows没有安装openssh-client,通过 程序功能
通过cmd 进行ssh连接Linux系统
通过第三方ssh工具连接Linux系统(xshell putty mobaxterm …)
Xmanager的套件,xshell xftp等等
文件传输工具-scp
openssh-client软件包中。提供了ssh 、scp、sftp、rsync这样的公开
scp 传输文件,在RHEL9中不推荐使用scp命令传输文件,因为scp命令有漏洞BUG
当系统的变量文件中 包含 输出内容的命令或者程序的时候,scp传输文件会失败!!!
/etc/bashrc /etc/profile ~username/.bashrc ~username/.bash_profile
scp传输文件:
在本地进行传输,类似于cp
scp 文件 路径
在远程进行传输:
推送:将本机的文件传输到远程主机上
client server
scp 文件 远程用户@远程IP地址:远程的路径
拉取:将远程主机的文件传输到本机上
client server
scp 远程用户@远程IP地址:远程的路径 路径
scp常用选项:
-r 拷贝目录
-p 保留文件权限、时间戳等属性信息
-C 压缩数据,一定程度上提高传输效率
在传输大文件的情况下才会有明显的效果
-P 指定端口
ssh服务默认监听22端口,22端口被修改了 修改成2222端口
sftp命令。操作命令和ftp命令类似。也可以进行文件的传输
什么时候用??使用工具来进行sftp的传输
rsync命令 文件同步 传输
# 本地同步
rsync 本地文件 本地目录
# 远程同步
推送:将本机的文件传输到远程主机
rsync 本机文件 远程用户@远程主机IP:远程路径
拉取:将远程主机的文件传输到本机
rsync 远程用户@远程主机IP:远程路径 本机文件
P:如果在本地同步到的时候,rsync后面接的路径带有/ 和 不带有/ 是由区别的
带/的路径,会将整个目录进行同步
不带/的路径,会将目录下的内容进行同步
rsync -a Desktop/ /opt/ 这里会将Desktop目录下的所有文件同步到/opt目录
rsync -a Desktop /opt/ 这里会将Destop目录进行同步
rsync常用选项:
-a 一系列选项的集合,拷贝目录 保持时间戳 保持文件权限 保留特殊设备文件和软链接
-v 查看详细信息
-n 仅仅测试是否可以同步,不会真的同步
-z 压缩数据 提供传输效率
--delete 以源路径为主,删除远程主机上多出来的文件
以源路径为主,增加远程主机上少的文件
多则删除,少则添加;内容一并同步
--existing 只更新远程主机上存在的文件内容,不存在的文件不做操作
client /opt目录下有 file1 和 file2文件
server /opt目录下有 aaa 和 file1 和 file2文件
同步的时候,只会更新file1和file2两个文件的内容
--ignore-existing 只更新远程不存在的文件,存在的文件不操作
如果--existing和--ignore-existing联合使用,会有特殊情况
两者联合使用,只会匹配文件,不会做其他操作;
除非加上--delete 选项,会实现删除远程多出来的文件
所以,如果想要保持主机之间的目录 文件一致,通过以上选项可以实现
--remove-source-files 传输文件后自动删除本机传输的文件
相当于,scp 拷贝到远程主机,然后通过rm 删除拷贝过去的文件
ssh安全机制
文件:/etc/ssh/sshd_config 服务端的主配置文件
# Port 22 默认ssh监听的是22端口
# MaxAuthTries 6 密码错误重试的次数
# MaxSessions 10 最大使用ssh连接可以开启10个会话
# PermitRootLogin 是否允许root用户远程ssh连接
在RHEL9开始,默认是不允许root远程ssh登录
允许root用户ssh连接的步骤:
修改文件/etc/ssh/sshd_config 的 PermitRootLogin ,在后面添加yes
systemctl restart sshd
# PasswordAuthentication yes 是否允许密码认证
# PermitEmptyPasswords no 是否允许空密码远程ssh
# DenyUsers *@192.168.68.1 拒绝192.168.68.1来登录任何的用户
# DenyUsers lisi
# DenyUsers lisi@192.168.68.1 拒绝指定IP登录指定用户
ssh认证原理
ssh登录系统有两种认证方式:
基于密码认证基于密钥认证
密钥对:以上两种方式都是通过密钥对的形式来进行认证
对称加密:加密和解密都是一把密钥
非对称加密:加密是公钥,解密是私钥
(在软件包管理章节中,公钥解密,私钥加密 数字签名)
密码认证的流程:
客户端通过ssh命令 向服务端发送连接请求,服务端发送自己的公钥给客户端服务端的公钥保存到客户端家目录下的.ssh/know_hosts文件中客户端输入服务端的密码,并且通过服务端的公钥来对密码进行加密客户端将加密的密文发送给服务端,服务端用自己的私钥来进行解密。如果解密后的密码和用户的密码一致,则允许登录,反之 不允许登录
密钥认证流程:
也叫做免密登录,也即是不需要输入任何的密码即可直接登录远程Linux系统;

在第一步进行补充:服务端是如何进行验证客户端的公钥的???
假如有多个客户端都发送了公钥给服务端,服务端是怎么知道这个公钥是属于谁的??!
服务端会发送一个随机字符串,然后客户端接受后会拿自己的私钥进行签名然后发给服务端,服务端就拿着所有的客户端的公钥进行匹配验证
P:想要免密登录到哪个Linux系统,就将公钥发送给哪个Linux系统
# 配置密钥免密登录
1. 生成一对密钥对(公钥和私钥)
[root@RHEL9 ~]# ssh-keygen
默认保存的路径是 用户家目录下的.ssh 目录
ssh-keygen -t 加密格式
2. 将客户端的公钥发送给服务端
[root@RHEL9 ~]# ssh-copy-id root@192.168.68.129
只能免密登录到远程的root用户
在服务端的用户家目录下 .ssh/authorized_keys 文件产生,此文件保存客户端了公钥
如果做了免密,依旧无法免密登录,请检查服务端的authorized_keys文件保存的公钥是否和客户端一致
比如scp rsync,这类使用ssh进行传输文件的命令,在配置ssh免密之后也不需要验证密码可以进行直接传输
SSH私钥保存的建议
私钥尽量不要外传,任何人拿到你的私钥都可以进行免密登录到系统只要用户可以读私钥的内容,那么都可以拿这把私钥进行免密登录推荐私钥的权限为600,也就是只有私钥的拥有人有权限如果密钥过大,会发送无法免密登录的情况
如果使用免密登录的时候,会提示 remote public key 被修改;也就是远程的主机公钥被修改了,当前主机还没有修改,用的是原来的主机公钥。这个时候你也无法实现登录
解决办法:将客户端的.ssh/know_hosts文件中保存的对应的公钥删除掉,然后重新ssh 进行保存公钥
如果对生成的密钥对设置密码,在第一次登录后,会在系统的后台进程开启一个ssh-agent代理,当这个进程存在的时候,后面每一次登录都不要验证密钥的密码
ssh私钥的代理
适合场景:当ssh的私钥加密了,可以使用代理来进行免密登录;不然每一次登录都需要验证私钥的密码。
临时可以将ssh私钥的密码写到内存中,不需要反复验证私钥的密码;可以临时将这种代理给其他人使用,又不想直接给其他人私钥的密码。
1. 开启一个shell代理
ssh-agent bash
2. 将私钥导入到shell代理中
ssh-add
通过ssh-agent查看环境变量,查看私钥的密码保存路径
[root@client opt]# ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-XXXXXXvvCFNr/agent.16832; export SSH_AUTH_SOCK;
SSH_AGENT_PID=16833; export SSH_AGENT_PID;
echo Agent pid 16833;
# 就算拿走了私钥也没有任何作用,因为私钥依旧存在密码
SSH隧道和端口转发
ssh隧道:将请求进行转发,无需暴露个人的网络信息
隧道分类:
本地端口转发:将本机的端口流量转发给远程的主机远程端口转发:将远程端口的流量转发给另外一个主机动态端口转发(socket代理)
本地端口转发:
适合场景:本机无法实现上网,需要通过跳板机的存在来进行连接;
家庭网络—公司的跳板机—公司内部服务器
# 实验需求:准备3台虚拟机,
node1 192.168.68.137 客户机
node2 192.168.68.138 跳板机
node3 192.168.68.139 服务器
#1. 需要让node3不允许node1远程ssh登录
[root@node3 ~]# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.68.137" port port=22 protocol="tcp" reject' --permanent
success
[root@node3 ~]# firewall-cmd --reload
success
或者
在ssh的配置文件中指定 DenyUsers *@192.168.68.137
#2.在node1上配置本地端口转发,借助node2实现ssh登录到node3节点
[root@node1 ~]# ssh -Nf -L 9999:192.168.68.139:22 192.168.68.138
-L 本地端口转发,将本地某个端口流量转发给其他主机
-N 不执行任何命令,只做端口转发
-f 放在后台执行
9999 本地开放的端口(node1)
192.168.68.139:22 转发到指定的IP和端口
192.168.68.138 中转机器(跳板机)

远程端口转发:
使用场景:不想要其他人主动连接跳板机,或者其他人不知道跳板机的密码
# 实验需求:准备3台虚拟机,
node1 192.168.68.137 客户机
node2 192.168.68.138 跳板机
node3 192.168.68.139 服务器
#1. 需要让node3不允许node1远程ssh登录
[root@node3 ~]# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.68.137" port port=22 protocol="tcp" reject' --permanent
success
[root@node3 ~]# firewall-cmd --reload
success
或者
在ssh的配置文件中指定 DenyUsers *@192.168.68.137
#2.在node2上配置远程端口转发,借助node2实现ssh登录到node3节点
[root@node2 ~]# ssh -Nf -R 8888:192.168.68.139:22 192.168.68.137
-R 远程端口转发,将其他主机的端口流量转发到其他主机上
-N 不执行任何命令,只做端口转发
-f 放在后台执行
8888 本地开放的端口(node1)
192.168.68.139:22 转发到指定的IP和端口
192.168.68.137 指定的是node1机器,将node1的流量转发
动态端口转发
使用场景:个人主机无法访问特定的网站,可以通过代理来进行访问

# 实验需求:准备3台虚拟机,
node1 192.168.68.137 个人主机
node2 192.168.68.138 云主机
node3 192.168.68.139 国外网站的机器
# 1. 在node3机器上搭建一个web网站
[root@node3 ~]# mount /dev/sr0 /mnt
mount: /mnt: WARNING: device write-protected, mounted read-only.
[root@node3 ~]#
cat > /etc/yum.repos.d/dvd.repo <<EOF
[BaseOS]
name=BaseOS
baseurl=file:///mnt/BaseOS
gpgcheck=0
enabled=1
[AppStream]
name=AppStream
baseurl=file:///mnt/AppStream
gpgcheck=0
enabled=1
EOF
[root@node3 ~]# yum install httpd -y
[root@node3 ~]# echo "rhcsa:google" > /var/www/html/index.html
[root@node3 html]# firewall-cmd --permanent --add-service=http
[root@node3 html]# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.68.137" port port=80 protocol=tcp reject' --permanent
success
[root@node3 html]# firewall-cmd --reload
success
[root@node3 html]# systemctl restart httpd
[root@node3 html]# netstat -tnlp | grep :80
tcp6 0 0 :::80 :::* LISTEN 24589/httpd
# 2.动态端口转发配置,在node1上开启代理配置
[root@node1 ~]# ssh -fN -D 5555 192.168.68.138
-f 后台运行
-N 只转发端口
-D 动态端口转发
5555 本地开放的端口
192.168.68.138 云主机,代理服务器
# 3.验证
curl -x socks://代理ip:端口 访问的网址
使用代理去访问。对面的机器留下的是代理服务器的IP 而不是你自己本身的IP
[root@node1 ~]# curl -x socks://127.0.0.1:5555 http://192.168.68.139
rhcsa:google
