当前位置: 首页 > news >正文

FTP、SFTP安装,整合Springboot教程

文章目录

  • 前言
  • 一、FTP、SFTP是什么?
    • 1.FTP
    • 2.SFTP
  • 二、安装FTP
    • 1.安装vsftp服务
    • 2.启动服务并设置开机自启动
    • 3.开放防火墙和SELinux
    • 4.创建用户和FTP目录
    • 4.修改vsftpd.conf文件
    • 5.启动FTP服务
    • 6.问题
  • 二、安装SFTP
    • 1、 创建用户
    • 2、配置ssh和权限
    • 3、建立目录并赋予权限
    • 4、启动并测试
  • 三、ftp、sftp结合springboot
    • 1、ftp整合springboot
    • 2、sftp整合springboot
  • 总结


前言

在一般项目开发工程中,我们大多数会使用文件服务,比如上传图片、各种文档之类的。
供我们选择的方式很多,比如第一种直接通过Java的File对象存储在本地,然后部署时候修改linux环境下的路径,这种方式简单粗暴;

第二种就是在连网的情况下,直接使用OSS对象存储,比如阿里云OSS对象存储,当然这种是要花钱的,如果不花钱的话,
也可以自己本地搭建一个OSS本地对象存储;

第三种就是我们今天要说的,在Linux服务器上面通过ftp服务、sftp服务搭建一个文件服务,其实本质上第一种类似,直接读取磁盘上面的文件;然后我们通过springboot程序来读取操作;


一、FTP、SFTP是什么?

1.FTP

  • FTP 是不安全的,因为它在传输过程中使用明文传输密码和数据,容易受到窃听和攻击。
  • FTP 默认使用端口21进行控制连接,和端口20进行数据连接。
  • FTP 提供了基本的文件上传和下载功能,以及简单的目录操作。
  • 适合于内部网络环境或者传输不敏感的数据,对安全性要求不高的场景。
  • FTP有主动和被动模式两种,简单讲,主动就是客户端随机开了端口,然后服务器端主动连接,然后传输数据;被动就是服务器先开了一个 大于 1024 小于65535的端口,然后客户主动去连接,然后传输数据;至于更详细的参考其它说明文章。

2.SFTP

  • SFTP 基于SSH协议,所有的数据传输都被加密,包括身份验证信息和传输的文件内容,因此提供了更高的安全性。
  • SFTP 默认使用SSH的端口(通常是22),只需要一个端口来完成所有的传输。
  • SFTP 不仅支持文件传输,还可以进行更多高级的文件管理操作,比如权限管理和符号链接的操作。
  • 适合于需要保证数据传输安全性的场景,特别是在Internet环境中传输敏感数据或者需要进行复杂文件管理的情况下。
    总结来说,选择使用FTP还是SFTP取决于你的具体需求,特别是对于数据安全性的要求。如果需要更高的安全性和更丰富的功能,建议选择SFTP。

二、安装FTP

1.安装vsftp服务

yum -y install vsftpd

服务器需要联网。
安装FTP

2.启动服务并设置开机自启动

systemctl start vsftpd            # 启动vsftpd
systemctl enable vsftpd.service   # 设置开机自启动

3.开放防火墙和SELinux

主要是为了减少麻烦的产生,关闭防火墙和selinux,等搭建成功可以开启防火墙和相应的端口。

systemctl stop firewalld.service      #关闭防火墙
systemctl disable firewalld.service   #并设置开机自启# 修改 /etc/selinux/config 将SELINUX=enforcing改为disabled
vim /etc/selinux/config
setenforce 0    #使修改后的配置文件生效

4.创建用户和FTP目录

ftpuser1和ftpuser1为该FTP服务创建的用户,而/web/www/html作为两个用户的访问目录(限制)。

创建文件目录并配置权限:

mkdir -p /web/www/html    
chmod -R 775 /web/www/html

创建ftp组以及用户:

我们创建的team1和team2用户,为了系统安全考虑,当然不希望能让这两个账号的登录系统,要使得FTP组的用户不能的登录系统,则需要为FTP用户统一建立在不能登录系统的shell中,就拿 /sbin/nologin 来实现;
-g:指定所属组
-d:指定家目录
-M:不创建家目录
-s:不登录系统

#创建组ftp
groupadd ftpgroup # 创建用户
useradd -g ftpgroup -d /web/www/html -M -s /sbin/nologin ftpuser1
useradd -g ftpgroup -d /web/www/html -M -s /sbin/nologin ftpuser2
#为用户创建密码
passwd ftpuser1@123456
passwd ftpuser2@123456# 修改/web/www/html目录为ftpgroup组
chown root:ftpgroup /web/www/html

4.修改vsftpd.conf文件

先将/etc/vsftpd/vsftpd.conf配置文件备份(防止后面出错后没法还原),然后进行修改:

cd /etc/vsftpd/
cp vsftpd.conf vsftpd.conf.backup
vim vsftpd.conf 

进入该配置文件后,将101、102、104行的内容去掉注释:
在这里插入图片描述
将剩下注释的内容全部删除后剩下的内容:
在这里插入图片描述

解释常用的:
anonymous_enable=YES #是否开启匿名用户,因为这里指定用户所以修改为NO
local_enable=YES #是否允许本地用户登录,默认允许
write_enable=YES #是否允许账号有写的权限
local_umask=022 :掩码
#本地用户创建文件目录都会默认777-022=755,最终文件目录的权限为755
#然而创建文件会默认666-022=644,最终创建的文件权限为644
dirmessage_enable=YES # 进入某个目录会提示
根据实验要求创建的两个用户只能在受限于/web/www/html文件目录下,跟以下两条命令的搭配效果有关:
chroot_local_user=YES
chroot_list_enable=NO # 激活chroot功能
#在文件 /etc/vsftpd/chroot_list 中列出的用户不能切换到其他目录
chroot_list_file=/etc/vsftpd/chroot_list #设置锁定用户在根目录列表的文件

添加配置文件:
除了以上的还需添加以下的配置

local_root=/web/www/html #设置本地用户的根目录
allow_writeable_chroot=YES #允许 chroot限制,否则出现连接错误。

最终文件配置信息 :
在这里插入图片描述
创建 /etc/vsftpd/chroot_list 文件:

vim /etc/vsftpd/chroot_list

添加 ftpsuer1和 ftpsuer2注意换行

5.启动FTP服务

systemctl restart vsftpd
# 在客户端上需要先安装 ftp 服务
yum -y install ftp

在这里插入图片描述

6.问题

  • 问题1、安装vsftpd时候,可能包yum源的问题,更换阿里云、或者其它的yum源即可;
  • 问题2、Security: Bad IP connecting 错误
    ftp客户端软件连接vsftpd服务报此错误,大概原因是在连接中变换了IP地址。
    解决办法:
vim /etc/vsftpd/vsftpd.conf
# 添加:
pasv_promiscuous=YES
# 保存后退出,重启 vsftpd
systemctl restart vsftpd 

pasv_promiscuous选项参数说明:
此选项激活时,将关闭PASV模式的安全检查。该检查确保数据连接和控制连接是来自同一个IP地址。
小心打开此选项。此选项唯一合理的用法是存在于由安全隧道方案构成的组织中。默认值为NO。
合理的用法是:在一些安全隧道配置环境下,或者更好地支持FXP时(才启用它)。

FTP模式与数据端口:

FTP 分为两类,PORT FTP和PASV FTP,PORT FTP是一般形式的FTP。这两种FTP在建立控制连接时操作是一样的,都是由客户端首先和FTP服务器的控制端口(默认值为21)建立控制链接,并通过此链接进行传输操作指令。它们的区别在于使用数据传输端口(ftp- data)的方式。PORT FTP由FTP服务器指定数据传输所使用的端口,默认值为20。PASV FTP由FTP客户端决定数据传输的端口。 PASV FTP这种做法,主要是考虑到存在防火墙的环境下,由客户端与服务器进行沟通(客户端向服务器发出数据传输请求中包含了数据传输端口),决定两者之间的数据传输端口更为方便一些。

  • 问题3: ftp登录时,解决报错530,500,421等错误
    第一步:cat /etc/passwd 查看是否是之前添加的用户,并确定是否存在。
    在这里插入图片描述
    若没有创建成功,则使用useradd -s /sbin/nologin team1等用户
    然后通过设置密码来passwd team1

第二步骤:如果报错:530 Login incorrect. Login failed.
cat /etc/passwd,查看你登陆的账户主目录和登陆shell对应的是什么,我的是/sbin/nologin
用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell;
查看cat /etc/shells是否有你用户的主目录和登陆shell ,没有进行添加,保存,退出。
在这里插入图片描述
我的也是开始没有,然后添加了一行;

  • 最后一点: 一定要注意文件夹和文件得所属,一定是刚才新建得用户的,不然没有权限的错误,
    如500 OOPS: vsftpd: refusing to run with writable root inside chroot() Login failed. 或者 421 Service not available, remote server has closed connection。

二、安装SFTP

基本语法:

-c comment 指定一段注释性描述。备注文字保存在passwd的备注栏中。
-d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
-g 用户组 指定用户所属的用户组。
-G 用户组,用户组 指定用户所属的附加组。
-s Shell文件 指定用户的登录Shell。
-u 用户号 指定用户的用户ID号,如果同时有-o选项,则可以重复使用其他用户的标识号。
-D:变更预设值。
-e:指定账号的有效期限,缺省表示永久有效。
-f:指定在密码过期后多少天即关闭该账号。
-m:自动建立用户的登入目录。
-M:不要自动建立用户的登入目录。
-n:取消建立以用户名称为名的群组。
-r:建立系统账号。

说明:sftp采用的是ssh加密隧道,安装性方面较ftp强,而且依赖的是系统自带的ssh服务,但速度较ftp慢。

1、 创建用户

我们要建立一个专门管理sftp的用户或者用户组,方便我们管理权限。 如果有多个sftp用户建议新建用户组,此次试验我只用一个用户,为了方便用用户名的方式去进行。

groupadd sftpgroup
useradd -s /sbin/nologin -g sftpgroup -M sftp_user
passwd sftp_user # sftpuse@123456

2、配置ssh和权限

关闭SElinux:

vim /etc/sysconfig/selinux
# 找到并修改这行为
SELINUX=disabled

tips:SELINUX默认是开启的,这样重启sshd会提示权限不够,设置为disabled需要重启生效。

修改sshd配置文件:
将Subsystem sftp /usr/libexec/sftp-server 注释掉,在文件末尾添加以下几行:

vim /etc/ssh/sshd_configSubsystem sftp internal-sftp
X11Forwarding no
AllowTcpForwarding noMatch User sftp_user
ChrootDirectory /data
ForceCommand internal-sftp

如下图:
结果图片

3、建立目录并赋予权限

mkdir /data
usermod -d /data sftp_user
# 根目录必须是root
chown root:root /data
chmod 755 /data/
# 或者
chown -R sftp_root:root /data/
# 在data下创建file文件夹存放我们上长传的文件
mkdir -p /data/file
# 必须更改用户的所属
chown -R sftp_user:sftpgroup /data/file/

上面说了,因为使用了ChrootDirectory /data作为qhlh的sftp根目录。
ChrootDirectory设置的目录权限及其所有的上级文件夹权限,属主和属组必须是root;
ChrootDirectory设置的目录权限及其所有的上级文件夹权限,只有属主能拥有写权限,也就是说权限最大设置只能是755;
由于/data是root创建的,权限755,如果sftp_user直接sftp过去没有权限写入,因此,需要/data下创建新目录并给与sftp_user权限;

4、启动并测试

systemctl restart sshd.service# sftp本地登录
sftp sftp_user@192.168.1.160
# 上传
put /opt/test.txt
# 下载
get test.txt /opt

效果如下图:
在这里插入图片描述
问题

Write failed: Broken pipe > Couldn‘t read packet: Connection reset by peer SFTP服务器连接出现的问题
Write failed: Broken pipe
Couldn’t read packet: Connection reset by peer

这个问题的原因是ChrootDirectory的权限问题,你设定的目录必须是root用户所有,否则就会出现问题。
所以请确保sftp用户根目录的所有人是root, 权限是 750 或者 755。
注意以下两点原则:
目录开始一直往上到系统根目录为止的目录拥有者都只能是 root,用户组可以不是 root。
目录开始一直往上到系统根目录为止都不可以具有群组写入权限。

三、ftp、sftp结合springboot

注意:整合这一块,只提供关键信息,就不完全提供代码了。

1、ftp整合springboot

搭建单体springboot项目框架,引入基本依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.9.0</version>
</dependency>
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-io</artifactId><version>1.3.2</version>
</dependency>
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version>
</dependency>
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency>

项目目录结构:
在这里插入图片描述
配置连接信息:
在这里插入图片描述
Java配置:
在这里插入图片描述
FTPClient配置:
在这里插入图片描述
FtpService接口:
在这里插入图片描述
FtpService接口实现:

@RequiredArgsConstructor
@Service
public class FtpServiceImpl implements FtpService {private final FTPClient ftpClient;@Overridepublic boolean uploadFile(MultipartFile file) {try {String remoteFilePath = "/w/n";// 设置Passive Modethis.ftpClient.enterLocalPassiveMode();// 设置缓冲区大小为1MBthis.ftpClient.setBufferSize(1024 * 1024);this.ftpClient.setFileType(FTP.BINARY_FILE_TYPE);this.createRemoteDirectory(this.ftpClient, remoteFilePath);// 切换工作目录boolean success = this.ftpClient.changeWorkingDirectory(remoteFilePath);if (!success) {System.out.println("切换工作目录失败:" + remoteFilePath);return false;}if (file.isEmpty()) {System.out.println("上传的文件不能为空");return false;}String remoteFileName = this.md5(Objects.requireNonNull(file.getOriginalFilename()));success = this.ftpClient.storeFile(remoteFileName, file.getInputStream());if (success) {System.out.println("文件上传成功");} else {System.out.println("文件上传失败");}return success;} catch (IOException e) {e.printStackTrace();System.out.println("文件上传失败:" + e.getMessage());return false;}}// 其它实现}

测试:
在这里插入图片描述
API接口层:
在这里插入图片描述

2、sftp整合springboot

目录结构和上面的一样:
在这里插入图片描述
引入sftp的依赖:

<!-- SFTP -->
<dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55</version>
</dependency>

配置连接信息:
在这里插入图片描述
在这里插入图片描述
接口和实现:
在这里插入图片描述
在这里插入图片描述
SftpUtils工具类:

@Slf4j
@Component
public class SftpUtils {@Resourceprivate SftpProperties sftpProperties;/*** 创建SFTP连接*/public ChannelSftp createSftp() throws JSchException {JSch jsch = new JSch();log.info("Try to connect sftp[" + sftpProperties.getUsername() + "@" + sftpProperties.getHost() + "]");Session session = createSession(jsch, sftpProperties.getHost(), sftpProperties.getUsername(), 	 			sftpProperties.getPort());session.setPassword(sftpProperties.getPassword());session.setConfig("StrictHostKeyChecking", "no");// 默认情况下,JSch库本身并没有会话超时时间。// 为了避免长时间无活动连接占用资源或因网络问题导致连接挂起而不被释放,通常建议设置会话超时,(单位:毫秒)session.setTimeout(30000);session.connect();log.info("Session connected to {}.", sftpProperties.getHost());Channel channel = session.openChannel(sftpProperties.getProtocol());channel.connect();log.info("Channel created to {}.", sftpProperties.getHost());return (ChannelSftp) channel;}/*** 创建 Session*/public Session createSession(JSch jsch, String host, String username, Integer port) throws JSchException {Session session = null;if (port <= 0) {session = jsch.getSession(username, host);} else {session = jsch.getSession(username, host, port);}if (session == null) {throw new RuntimeException(host + "session is null");}return session;}/*** 关闭连接*/public void disconnect(ChannelSftp sftp) {try {if (sftp != null) {if (sftp.isConnected()) {sftp.disconnect();} else if (sftp.isClosed()) {log.error("sftp 连接已关闭");}if (sftp.getSession() != null) {sftp.getSession().disconnect();}}} catch (JSchException e) {log.error("sftp 断开连接失败,原因:{}", e.getMessage(), e);}}}

单元测试:
在这里插入图片描述
注意:连接的时候,确保端口和IP可以访问。


总结

最后,终于完了,内容还是有点多,有些细节未考虑到,勿喷。

相关文章:

FTP、SFTP安装,整合Springboot教程

文章目录 前言一、FTP、SFTP是什么&#xff1f;1.FTP2.SFTP 二、安装FTP1.安装vsftp服务2.启动服务并设置开机自启动3.开放防火墙和SELinux4.创建用户和FTP目录4.修改vsftpd.conf文件5.启动FTP服务6.问题 二、安装SFTP1、 创建用户2、配置ssh和权限3、建立目录并赋予权限4、启动…...

24年蓝桥杯及攻防世界赛题-MISC-3

21 reverseMe 复制图片&#xff0c;在线ocr识别&#xff0c;https://ocr.wdku.net/&#xff0c;都不费眼睛。 22 misc_pic_again ┌──(holyeyes㉿kali2023)-[~/Misc/tool-misc/zsteg] └─$ zsteg misc_pic_again.png imagedata … text: “$$KaTeX parse error: Undefined…...

阿里云容器服务Kubernetes部署新服务

这里部署的是前端项目 1.登录控制台-选择集群 2.选择无状态-命名空间-使用镜像创建 3.填写相关信息 应用基本信息&#xff1a; 容器配置&#xff1a; 高级配置&#xff1a; 创建成功后就可以通过30006端口访问项目了...

记录生产环境,通过域名访问的图片展示不全,通过ip+端口的方式访问图片是完整的

原因&#xff1a;部署nginx的服务器硬盘满了 排查发现nginx日志文件占用了大量硬盘 解决方案&#xff1a; 删除该文件&#xff0c;重启nginx服务&#xff0c;问题解决。...

网络安全实训八(y0usef靶机渗透实例)

1 信息收集 1.1 扫描靶机IP 1.2 收集靶机的端口开放情况 1.3 探测靶机网站的目录 1.4 发现可疑网站 1.5 打开可疑网站 2 渗透 2.1 使用BP获取请求 2.2 使用工具403bypasser.py探测可疑网页 2.3 显示可以添加头信息X-Forwarded-For:localhost来访问 2.4 添加之后转发&#xff…...

QT信号槽原理是什么,如何去使用它?

QT的信号槽&#xff08;Signals and Slots&#xff09;机制是QT框架的核心特性之一&#xff0c;它提供了一种对象间通信的方式&#xff0c;使得QT的部件可以在不知道彼此详细实现的情况下相互通信。这种机制在图形用户界面编程中尤为重要&#xff0c;因为它有助于降低对象间的耦…...

mybatisplus介绍以及使用(上)

目录 一、概念 1、什么是mybatisplus 2、为什么要使用mybatisplus 二、mybatisplus的使用 1、安装 2、常用注解 3、条件构造器 一、概念 1、什么是mybatisplus MyBatis-Plus&#xff08;简称MP&#xff09;是一个基于MyBatis的增强框架&#xff0c;旨在简化开发、提高…...

maxwell 输出消息到 redis

文章目录 1、maxwell 输出消息到 redis1.1、启动一个Maxwell容器&#xff0c;它会连接到指定的MySQL数据库&#xff0c;捕获变更事件&#xff0c;并将这些事件以Redis发布/订阅的形式发送到指定的Redis服务器1.2、在已运行的 Redis 容器中执行 Redis 命令行界面&#xff08;CLI…...

infoNCE损失和互信息的关系

文章目录 InfoNCE 损失与互信息的关系推导将相似度 sim ( q , x ) \text{sim}(q, x) sim(q,x) 看作是负的能量函数infoNCE和互信息的分母不同 InfoNCE 损失与互信息的关系推导 为了理解 InfoNCE 损失与互信息的关系&#xff0c;首先我们回顾两个公式的基本形式&#xff1a; 互…...

Java学习路线指南

目录 前言1. Java基础知识1.1 面向对象编程思想1.2 Java平台与JVM1.3 Java语言的核心概念 2. Java语法与基础实践2.1 数据类型与变量2.2 控制结构2.3 方法与函数2.4 数据结构与集合框架 3. Java进阶知识3.1 异步编程与多线程3.2 JVM调优与垃圾回收机制3.3 设计模式 4. 实践与项…...

在SpringCloud中实现服务间链路追踪

在微服务架构中&#xff0c;由于系统的复杂性和多样性&#xff0c;往往会涉及到多个服务之间的调用。当一个请求经过多个服务时&#xff0c;如果出现问题&#xff0c;我们希望能够快速定位问题所在。这就需要引入链路追踪机制&#xff0c;帮助我们定位问题。 Spring Cloud为我们…...

[数据集][目标检测]红外微小目标无人机直升机飞机飞鸟检测数据集VOC+YOLO格式7559张4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;7559 标注数量(xml文件个数)&#xff1a;7559 标注数量(txt文件个数)&#xff1a;7559 标注…...

TS Vue项目中使用TypeScript

模块系统与命名空间 概念 模块化开发是目前最流行的组织代码方式&#xff0c;可以有效的解决代码之间的冲突与代码之间的依赖关系&#xff0c;模块系统一般视为“外部模块”&#xff0c;而命名空间一般视为“内部模块” 模块系统 TS中的模块化开发跟ES6中的模块化开发并没有…...

打工人、设计师必备的AI抠图工具

前言 你是否厌倦了繁琐的PS操作&#xff1f;是否在寻找一种快速、简便的抠图方法&#xff1f;别担心&#xff0c;AI技术已经为你准备好了解决方案。以下是9个令人惊叹的AI抠图工具&#xff0c;让你无需PS也能轻松获得专业级别的抠图效果。 1. 千鹿设计助手&#xff1a;EmGaur…...

MyBatis中一对多关系的两种处理方法

目录 1.多表联查&#xff08;通过collection标签的ofType属性&#xff09; 1&#xff09;mapper 2&#xff09;mapper.xml 3&#xff09;测试代码 4&#xff09;测试结果 2.分布查询(通过collection标签的select属性) 1&#xff09;mapper 2&#xff09;mapper.xml 3&#xff0…...

视频美颜SDK与直播美颜工具的实现原理与优化方案

本篇文章&#xff0c;小编将为大家详细讲解视频美颜SDK的实现原理&#xff0c;并提出优化方案。 一、视频美颜SDK的实现原理 1.图像采集与处理 2.人脸识别与关键点检测 3.美颜滤镜与特效处理 4.实时性与低延迟 二、直播美颜工具的实现原理 直播美颜工具与视频美颜SDK的…...

Linux 安装JDK8和卸载

目录 一、下载JDK8的rpm包 二、安装JDK 三、设置环境变量 Linux环境下安装JDK的方式有多种&#xff0c;可以通过rpm包、yum安装或者tar.gz压缩包。本章节会教大家通过前两者方式来安装JDK&#xff0c;压缩包的形式因为下载压缩包后上传到服务器环境下&#xff0c;将压缩包解…...

javascript 浏览器打印不同页面设置方向,横向纵向打印

// 在JavaScript中添加打印样式 const printStyle document.createElement(style); printStyle.innerHTML media print { page { size: landscape; }body { margin: 10mm; } }; document.head.appendChild(printStyle);// 触发打印 function printPage() {window.print(); }/…...

Maven 的多种打jar包方式详细介绍、区别及使用教程——附使用命令

文章目录 1. **标准 JAR 打包****打包方式****配置示例****使用方式****优点****缺点** 2. **可执行 JAR&#xff08;Executable JAR&#xff09;****打包方式****配置示例****使用方式****优点****缺点** 3. **Uber JAR&#xff08;Fat JAR / Shadow JAR&#xff09;****打包方…...

计算机毕业设计 基于协同过滤算法的个性化音乐推荐系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…...

Arthas 全攻略:让调试变得简单

文章目录 一、简介二、命令列表 一、简介 注意 &#xff1a; 我安装的版本是&#xff1a;Arthas V3.7.2 官网&#xff1a;https://arthas.aliyun.com/doc/ 相关错误解决方案请看GitHub&#xff1a;https://github.com/alibaba/arthas/issues Alibaba开源的Java诊断工具。 从…...

icpc江西:L. campus(dij最短路)

题目 在樱花盛开的季节&#xff0c;西湖大学吸引了大量游客&#xff0c;这让胥胥非常烦恼。于是&#xff0c;他发明了一个神奇的按钮&#xff0c;按下按钮后&#xff0c;校园里所有的游客都会以光速从最近的大门离开学校。现在&#xff0c;胥胥非常好奇&#xff0c;游客们以光…...

日志收集工具 Fluentd vs Fluent Bit 的区别

参考链接&#xff1a; FluentdFluentd BitFluentd & Fluent Bit | Fluent Bit: Official Manual Fluentd 与 Fluent Bit 两者都是生产级遥测生态系统&#xff01; 遥测数据处理可能很复杂&#xff0c;尤其是在大规模处理时。这就是创建 Fluentd 的原因。 Fluentd 不仅仅是…...

PostgreSQL技术内幕11:PostgreSQL事务原理解析-MVCC

文章目录 0.简介1.MVCC介绍2.MVCC常见的实现方式3.PG的MVCC实现3.1 可见性判断3.2 提交/取消 0.简介 本文主要介绍在事务模块中MVCC(多版本并发控制&#xff09;常见的实现方式&#xff0c;优缺点以及PG事务模块中MVCC&#xff08;多版本并发控制&#xff09;的实现。 1.MVCC…...

Java-面向对象编程(基础部分)

类和对象的区别和联系 类&#xff1a;类是封装对象的属性和行为的载体&#xff0c;在Java语言中对象的属性以成员变量的形式存在&#xff0c;而对象的方法以成员方法的形式存在。 对象&#xff1a;Java是面向对象的程序设计语言&#xff0c;对象是由类抽象出来的&#xff0c;…...

SMS over IP原理

目录 1. 短消息业务的实现方式 2. 传统 CS 短消息业务中的发送与送达报告 3. MAP/CAP 信令常见消息 4. SMS over IP 特点概述 5. SMS over IP 中的主要流程 5.1 短消息注册流程(NR 或 LTE 接入) 5.2 短消息发送(MO)流程(NR 或 LTE 接入) 5.3 短消息接收(MT)流程(NR 或…...

Linux中使用Docker容器构建Tomcat容器完整教程

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f427;Linux基础知识(初学)&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; &#x1f510;Linux中firewalld防火墙&#xff1a;点击&#xff01; ⏰️创作…...

【机器学习】7 ——k近邻算法

机器学习7——k近邻 输入&#xff1a;实例的特征向量 输出&#xff1a;类别 懒惰学习&#xff08;lazy learning&#xff09;的代表算法 文章目录 机器学习7——k近邻1.k近邻2.模型——距离&#xff0c;k&#xff0c;分类规则2.1距离——相似程度的反映2.2 k值分类规则 算法实…...

2024.09.09 校招 实习 内推 面经

&#x1f6f0;️ &#xff1a;neituijunsir 交* 流*裙 &#xff0c;内推/实习/校招汇总表格 1、校招 | 佑驾创新 MINIEYE 2025校园招聘正式启动&#xff08;内推&#xff09; 校招 | 佑驾创新 MINIEYE 2025校园招聘正式启动&#xff08;内推&#xff09; 2、校招 | 长安汽…...

浅谈Linux中的环回设备

什么是环回设备 环回设备&#xff08;loop device&#xff09; 是 Linux 系统中一种特殊的虚拟设备&#xff0c;它允许你将一个普通的文件当作块设备来操作。这意味着&#xff0c;借助环回设备&#xff0c;文件可以模拟为一个磁盘或分区&#xff0c;供系统读写。这种机制非常有…...