电子商务网站开发与设计项目管理,网站站长工具,深圳网站推广优,crm管理系统软件文章目录 前言一、FTP、SFTP是什么#xff1f;1.FTP2.SFTP 二、安装FTP1.安装vsftp服务2.启动服务并设置开机自启动3.开放防火墙和SELinux4.创建用户和FTP目录4.修改vsftpd.conf文件5.启动FTP服务6.问题 二、安装SFTP1、 创建用户2、配置ssh和权限3、建立目录并赋予权限4、启动… 文章目录 前言一、FTP、SFTP是什么1.FTP2.SFTP 二、安装FTP1.安装vsftp服务2.启动服务并设置开机自启动3.开放防火墙和SELinux4.创建用户和FTP目录4.修改vsftpd.conf文件5.启动FTP服务6.问题 二、安装SFTP1、 创建用户2、配置ssh和权限3、建立目录并赋予权限4、启动并测试 三、ftp、sftp结合springboot1、ftp整合springboot2、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服务器需要联网。
2.启动服务并设置开机自启动
systemctl start vsftpd # 启动vsftpd
systemctl enable vsftpd.service # 设置开机自启动3.开放防火墙和SELinux
主要是为了减少麻烦的产生关闭防火墙和selinux等搭建成功可以开启防火墙和相应的端口。
systemctl stop firewalld.service #关闭防火墙
systemctl disable firewalld.service #并设置开机自启# 修改 /etc/selinux/config 将SELINUXenforcing改为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 ftpuser1123456
passwd ftpuser2123456# 修改/web/www/html目录为ftpgroup组
chown root:ftpgroup /web/www/html4.修改vsftpd.conf文件
先将/etc/vsftpd/vsftpd.conf配置文件备份防止后面出错后没法还原然后进行修改:
cd /etc/vsftpd/
cp vsftpd.conf vsftpd.conf.backup
vim vsftpd.conf 进入该配置文件后将101、102、104行的内容去掉注释: 将剩下注释的内容全部删除后剩下的内容: 解释常用的 anonymous_enableYES #是否开启匿名用户因为这里指定用户所以修改为NO local_enableYES #是否允许本地用户登录默认允许 write_enableYES #是否允许账号有写的权限 local_umask022 掩码 #本地用户创建文件目录都会默认777-022755最终文件目录的权限为755 #然而创建文件会默认666-022644最终创建的文件权限为644 dirmessage_enableYES # 进入某个目录会提示 根据实验要求创建的两个用户只能在受限于/web/www/html文件目录下跟以下两条命令的搭配效果有关 chroot_local_userYES chroot_list_enableNO # 激活chroot功能 #在文件 /etc/vsftpd/chroot_list 中列出的用户不能切换到其他目录 chroot_list_file/etc/vsftpd/chroot_list #设置锁定用户在根目录列表的文件 添加配置文件 除了以上的还需添加以下的配置 local_root/web/www/html #设置本地用户的根目录 allow_writeable_chrootYES #允许 chroot限制否则出现连接错误。 最终文件配置信息 : 创建 /etc/vsftpd/chroot_list 文件:
vim /etc/vsftpd/chroot_list添加 ftpsuer1和 ftpsuer2注意换行
5.启动FTP服务
systemctl restart vsftpd
# 在客户端上需要先安装 ftp 服务
yum -y install ftp6.问题
问题1、安装vsftpd时候可能包yum源的问题更换阿里云、或者其它的yum源即可问题2、Security: Bad IP connecting 错误 ftp客户端软件连接vsftpd服务报此错误大概原因是在连接中变换了IP地址。 解决办法
vim /etc/vsftpd/vsftpd.conf
# 添加
pasv_promiscuousYES
# 保存后退出重启 vsftpd
systemctl restart vsftpd pasv_promiscuous选项参数说明 此选项激活时将关闭PASV模式的安全检查。该检查确保数据连接和控制连接是来自同一个IP地址。 小心打开此选项。此选项唯一合理的用法是存在于由安全隧道方案构成的组织中。默认值为NO。 合理的用法是在一些安全隧道配置环境下或者更好地支持FXP时(才启用它)。 FTP模式与数据端口 FTP 分为两类PORT FTP和PASV FTPPORT FTP是一般形式的FTP。这两种FTP在建立控制连接时操作是一样的都是由客户端首先和FTP服务器的控制端口(默认值为21)建立控制链接并通过此链接进行传输操作指令。它们的区别在于使用数据传输端口(ftp- data)的方式。PORT FTP由FTP服务器指定数据传输所使用的端口默认值为20。PASV FTP由FTP客户端决定数据传输的端口。 PASV FTP这种做法主要是考虑到存在防火墙的环境下由客户端与服务器进行沟通(客户端向服务器发出数据传输请求中包含了数据传输端口)决定两者之间的数据传输端口更为方便一些。 问题3 ftp登录时解决报错530500421等错误 第一步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 # sftpuse1234562、配置ssh和权限
关闭SElinux
vim /etc/sysconfig/selinux
# 找到并修改这行为
SELINUXdisabledtipsSELINUX默认是开启的这样重启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_user192.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项目框架引入基本依赖
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId
/dependency
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactId
/dependency
dependencygroupIdcommons-net/groupIdartifactIdcommons-net/artifactIdversion3.9.0/version
/dependency
dependencygroupIdorg.apache.commons/groupIdartifactIdcommons-io/artifactIdversion1.3.2/version
/dependency
dependencygroupIdorg.apache.commons/groupIdartifactIdcommons-lang3/artifactIdversion3.12.0/version
/dependency
dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/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 --
dependencygroupIdcom.jcraft/groupIdartifactIdjsch/artifactIdversion0.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可以访问。 总结
最后终于完了内容还是有点多有些细节未考虑到勿喷。