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_config

Subsystem sftp internal-sftp
X11Forwarding no
AllowTcpForwarding no

Match 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;

    @Override
    public boolean uploadFile(MultipartFile file) {
        try {
            String remoteFilePath = "/w/n";
            // 设置Passive Mode
            this.ftpClient.enterLocalPassiveMode();
            // 设置缓冲区大小为1MB
            this.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 {

    @Resource
    private 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可以访问。


总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/879575.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Elastic 的 OpenTelemetry PHP 发行版简介

作者&#xff1a;Pawel Filipczak 宣布 OpenTelemetry PHP 的 Elastic 发行版的第一个 alpha 版本。在本篇博文中了解使用 OpenTelemetry 来检测 PHP 应用程序是多么简单。 我们很高兴推出 OpenTelemetry PHP 的 Elastic Distribution 的第一个 alpha 版本。在这篇文章中&…

python植物大战僵尸项目源码【免费】

植物大战僵尸是一款经典的塔防游戏&#xff0c;玩家通过种植各种植物来抵御僵尸的进攻。 源码下载地址&#xff1a; 植物大战僵尸项目源码 提取码: 8muq

Ubuntu 22.04.5 LTS 发布下载 - 现代化的企业与开源 Linux

Ubuntu 22.04.5 LTS (Jammy Jellyfish) - 现代化的企业与开源 Linux Ubuntu 22.04.5 发布&#xff0c;配备 Linux 内核 6.8 请访问原文链接&#xff1a;https://sysin.org/blog/ubuntu-2204/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xf…

ICPC2024 邀请赛西安站 F L题解

F - XOR Game 题意 给定n,k ,k代表0的个数,现在有一个数x初始为0 接下来n个数,每一个数代表这个数字的个数 每次操作可以选择a数组中的一个数字并且可以选择是否将这个x异或上这个数字,然后把这个数字从a数组中删除,Alice先手,Alice想让答案尽可能大,Bob想让答案尽可能小,问…

腾讯音乐2024 Q2财报稳中有进,首席执行官梁柱(Ross Liang)强调平台创新

8 月 13 日&#xff0c;腾讯音乐娱乐集团&#xff08;Tencent Music Entertainment Group&#xff0c;以下简称“TME”&#xff09;发布 2024 年第二季度财报。本季度集团各项核心财务指标稳健增长&#xff0c;总收入达 71.6 亿元&#xff0c;调整后净利润 19.9 亿元&#xff0…

《Learning to Prompt for Vision-Language Models》CoOp论文中文校对版

系列论文研读目录 文章目录 系列论文研读目录摘要1 简介2 相关工作2.1视觉语言模型2.2 NLP中的提示学习 3 方法论3.1视觉语言预训练3.2上下文优化3.3讨论 4 实验4.1Few-Shot学习4.2领域泛化4.3进一步分析 5 结论、局限性和未来的工作 摘要 像CLIP这样的大型预训练视觉语言模型…

基于SpringBoot+Vue的篮球馆会员信息管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

36.贪心算法3

1.坏了的计算器&#xff08;medium&#xff09; . - 力扣&#xff08;LeetCode&#xff09; 题目解析 算法原理 代码 class Solution {public int brokenCalc(int startValue, int target) {// 正难则反 贪⼼int ret 0;while (target > startValue) {if (target % 2 0…

深入理解中比较两个字符串差异的方法”或“高效比对字符串:diff-match-patch:c++实战指南

diff-match-patch 是一个强大的开源 JavaScript 库&#xff0c;由 Google 开发并维护&#xff0c;用于计算两个字符串之间的差异&#xff0c;并进行高效的匹配和补丁应用。这个库广泛应用于版本控制系统、协同编辑系统以及任何需要处理文本变化的场景。 GitHub地址&#xff1a;…

继承1 2024_9_18

1.继承的基本用法 当需要继承的时候,我们就在派生类的后面加上一个权限父类,这个权限可以是公有,保护和私有,后面就是继承的父类.此时,下面的stu这个派生类,也就可以使用Person里面的方法了. 2.继承基类成员访问方式的变化 当父类被继承到派生类的时候,此时会根据继承方式的不…

k8s的NodeIP、PodIP、ClusterIP、ExternalIP

1.NodeIP K8s集群由Master Node与Worker Node组成。 Node&#xff1a;组成k8s集群的机器&#xff0c;可以是物理机或虚拟机。 Master Node &#xff1a;管理节点也叫控制平面主要负责管理控制方面。 Worker Node&#xff1a;&#xff1a;工作节点用于部署处理业务的工作负载或p…

spring springboot 日志框架

一、常见的日志框架 JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j.... 注意&#xff1a;SLF4j 类似于接口 Log4j &#xff0c;Logback 都是出自同一作者之手 JUL 为apache 公司产品 Spring&#xff08;commons-logging&#xff09;、Hibernate&#xff08;jboss…

万兆时代 TCP/IP如何赋能以太网飞跃

科技飞速发展&#xff0c;数据传输的需求日益增长&#xff0c;尤其是在物理、科研等领域&#xff0c;对数据传输的速度、稳定性和效率提出了更高的要求。在这样的背景下&#xff0c;万兆以太网&#xff08;10Gbit Ethernet&#xff09;以其高带宽、低延迟和强大的传输能力成为众…

视频监控摄像头国标GB28181配置参数逐条解析

转载&#xff1a;视频监控摄像头国标GB28181配置参数逐条解析 现在的很多信息化项目&#xff0c;都会涉及到国标GB28181的视频监控产品&#xff0c;当我们配置这些国标平台&#xff0c;录像机&#xff0c;摄像头时&#xff0c;如果对相关参数的定义不清楚的话&#xff0c;会给我…

Vulnhub:BlueSky

靶机下载地址 信息收集 主机发现 nmap扫描攻击机同网段存活主机。 nmap 192.168.31.0/24 -Pn -T4 靶机ip&#xff1a;192.168.31.171。 端口扫描 nmap 192.168.31.171 -A -p- -T4 开放端口22,8080。 目录扫描 访问8080端口&#xff0c;如图&#xff0c;是tomcat管理页面…

硬件工程师笔试面试——变压器

目录 9、变压器 9.1 基础 变压器原理图 变压器实物图 9.1.1 概念 9.1.2 变压器组成结构 9.1.3 变压器原理 9.1.4 变压器的类型 9.1.5 应用领域 9.2 相关问题 9.2.1 变压器的工作原理是什么? 9.2.2 如何选择合适的变压器类型? 9.2.3 变压器在实际应用中,如何进行…

安卓BLE蓝牙通讯

蓝牙测试demo 简介   Android手机间通过蓝牙方式进行通信&#xff0c;有两种常见的方式&#xff0c;一种是socket方式&#xff08;传统蓝牙&#xff09;&#xff0c;另一种是通过GATT&#xff08;BLE蓝牙&#xff09;。与传统蓝牙相比&#xff0c;BLE 旨在大幅降低功耗。这样…

iKuai使用及设置流程

iKuai使用及设置流程 iKuai安装步骤 一、配置主机 1.电脑连接ETH0网口 2.ETH1网口连接猫上面的千兆口 3.手动配置pc的IP地址和192.168.1.1./24在同一网段 3.浏览器输入192.168.1.1 admin admin 二、外网设置 1.直接联通电信网络设置 2.点击 网络设置-内外网设置-点击接…

Python “字符串操作” ——Python面试100道实战题目练习,巩固知识、检查技术、成功就业

本文主要是作为Python中列表的一些题目&#xff0c;方便学习完Python的元组之后进行一些知识检验&#xff0c;感兴趣的小伙伴可以试一试&#xff0c;含选择题、判断题、实战题、填空题&#xff0c;答案在第五章。 在做题之前可以先学习或者温习一下Python的列表&#xff0c;推荐…

食品检测与分类系统源码分享

食品检测与分类检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…