胡雁哀鸣夜夜飞,胡儿眼泪双双落。
1 前言
在项目开发中经常会遇到文件操作的场景,最近遇到了一个项目对账的业务,项目收集各个业务方的对账文件,进行业务对账。收集业务方的对账文件就是通过 sftp
的方式,在本文中将介绍如何创建 sftp
账号以及上传、下载、删除、查看文件的实践,后续将在此基础之上开展对账业务的分享。
2 centos 系统创建 sftp 账号
在使用 sftp 操作文件之前,需要先在服务器上创建 sftp 账号,具体操作如下所示:
bash
# 1 创建文件上传目录
mkdir /data/upload
# 2 创建用户组 egrep sftp /etc/group 查询用户组信息
groupadd sftp
# 3 创建sftp 用户并创建文件上传目录并设置用户密码
useradd -d /data/upload/clptsftp -m -g sftp -s /sbin/nologin clptsftp
mkdir -p /data/upload/clptsftp/upload
passwd clptsftp
# 4 修改用目录属性 root 和 clptsftp
chown root:root -R /data/upload/clptsftp
chmod 755 -R /data/upload/clptsftp
chown -R clptsftp:sftp /data/upload/clptsftp/upload
chmod 755 /data/upload/clptsftp/upload
# 5 修改 /etc/ssh/sshd_config 文件
#Subsystem sftp /usr/libexec/openssh/sftp-server #需要注释
Subsystem sftp internal-sftp #使用系统自带的internal-sftp
Match Group sftp
Match User clptsftp
ChrootDirectory /data/upload/clptsftp
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
# 6 重新启动 sshd
systemctl restart sshd
# 7 尝试连接, 如果连接失败查看 tail /var/log/secure -n 20 进行排查
sftp clptsftp@ip
创建 sftp 账号后,上传了文件后如下图所示,账号上传下载文件正常。
3 sftp 文件上传下载
在项目开发中操作文件的上传下载,需要先在项目中添加 jsch
依赖:
xml
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
jsch
使用了 java
实现了 ssh2
的连接,可以类比为 jdbc, 它可以帮助开发者连接 sshd
服务,使用端口转发,x11
转发,文件传输等功能,在 java
程序中集成可以实现对远程服务器的操作。
3.1 创建jsch连接
如下图所示,使用 jsch
的起手式如左边所示,在本文中使用的是 sftp
, 用于创建 sftp
的通道连接,此外如果需要远程执行服务器上的脚本,即可使用 exec
的方式。
连接 sftp 服务器时,需要根据主机、用户名、端口、密码等参数创建 ssh 会话,然后通过会话创建 sftp 通道连接。 对于 sftp 的操作,常用的命令如下所示:
bash
cd 切换到指定的目录
ls 展示当前目录下的所有文件
lstat 获取当前目录的属性
put 上传保存文件
get 查看获取文件
mkdir 创建目录
rm 删除文件
rmdir 删除目录
pwd 获取当前目录地址
rename 重命名文件
3.2 sftp 上传文件
如下图所示,即可实现 sftp
的文件上传,这里在上传时需要判断上传的目录是否存在,如果目录不存在,则需要循环创建目录,这里不能像 mkdir -p
那样一次性的创建完整的目录。对于文件的上传,可以使用文件流的方式,或者采用文件地址的方式即可实现文件的上传。对于文件的上传,默认采用的模式为覆盖方式,mode
参数选择 0 覆盖 1 恢复模式 2 追加模式
在控制器层的代码如下所示,在使用 sftp
上传文件时,需要先初始化 sftp
, 创建对应的会话和连接才能使用。
3.3 sftp 下载文件
对于文件的下载,也可以采用两种方式,将文件写入对应的文件目录或者将文件内容写入 response
中也可以实现文件的下载。
文件下载的代码在控制器层如下所示:
3.3 sftp 文件查看和删除
文件的查看和删除,采用的方式和在服务器上执行的命令类似,在删除文件时,需要判断删除的是文件还是目录,使用的命令是有所差异的。
查看和删除的代码如下所示:
4 上传实践
在上传文件时,需要按照日期来建立目录,用来存放文件,文件存储完成后,需要将文件存储后的路径进行返回,用于文件的查看。
5 总结
在本文中,主要讲述的是如何使用 sftp
工具来上传、下载、查看和删除文件,所涉及的代码已经上传至 github
, 欢迎大家点赞关注。项目 github
地址 springboot-auth。