一、SFTP使用场景
SFTP(Secure File Transfer Protocol,安全文件传输协议)是一种基于SSH协议的文件传输方式,相较于传统的FTP(File Transfer Protocol),SFTP在数据传输过程中提供了加密保护,确保数据的安全传输,SFTP适用于需要在不安全的网络环境中进行文件传输的场景,例如公司内部与外部合作伙伴之间的文件交换、远程服务器之间的文件同步等。
二、CentOS7搭建SFTP服务器
1. 创建sftp组
需要创建一个专门用于SFTP用户的组,以便对这些用户进行统一的管理,执行以下命令:
groupadd sftp
查看组信息以确认创建成功:
cat /etc/group | grep sftp
2. 创建SFTP用户并加入组
创建一个SFTP用户并将其加入到刚刚创建的sftp组中,设置该用户的密码:
useradd -g sftp -s /bin/false mysftp passwd mysftp
-s /bin/false
表示该用户不能通过Shell登录系统,只能通过SFTP访问。
3. 新建目录并指定为用户主目录
为SFTP用户创建一个主目录,并将其指定为该用户的家目录:
mkdir -p /sftp/mysftp usermod -d /sftp/mysftp mysftp
4. 编辑配置文件
编辑SSH配置文件sshd_config
,启用SFTP服务并进行相关配置:
vim /etc/ssh/sshd_config
在文件中添加或修改以下内容:
Subsystem sftp internal-sftp Match Group sftp ChrootDirectory /sftp/%u ForceCommand internal-sftp AllowTcpForwarding no X11Forwarding no
这些配置的作用如下:
Subsystem sftp internal-sftp
:指定SFTP子系统的路径。
Match Group sftp
:匹配属于sftp组的用户。
ChrootDirectory /sftp/%u
:将用户限制在其主目录下。
ForceCommand internal-sftp
:强制使用internal-sftp作为命令。
AllowTcpForwarding no
和X11Forwarding no
:禁止TCP转发和X11转发以提高安全性。
5. 设置Chroot目录权限
为了确保用户只能访问自己的目录,需要设置相应的权限:
chown root:sftp /sftp/mysftp chmod 755 /sftp/mysftp
为用户创建一个上传目录并设置权限:
mkdir /sftp/mysftp/upload chown mysftp:sftp /sftp/mysftp/upload chmod 755 /sftp/mysftp/upload
6. 关闭SELinux并重启sshd服务
在某些情况下,SELinux可能会阻止SFTP的工作,因此需要暂时关闭它:
setenforce 0
重启SSH服务使配置生效:
systemctl restart sshd.service
7. 测试连接
在其他服务器上使用SFTP客户端连接到刚刚搭建的SFTP服务器:
sftp -P 10001 mysftp@127.0.0.1
输入用户名和密码后,如果连接成功,则说明SFTP服务器搭建完成。
三、Windows搭建SFTP服务器
1. 下载并安装FreeSSHD
从官方网站下载FreeSSHD,并按照提示进行安装,安装过程中会自动生成密钥,直接点击确认即可。
2. 新增用户并更改认证方式
安装完成后,打开FreeSSHD,新增一个用户并设置其认证方式为密码认证。
3. 更改SFTP服务器根目录
根据需要更改SFTP服务器的根目录,以便用户能够上传和下载文件。
4. 启动服务并测试
启动FreeSSHD服务,然后使用SFTP链接工具(如xftp或Filezilla)进行测试,如果一切正常,则说明SFTP服务器搭建成功。
四、Java代码连接SFTP服务器
在Java项目中,可以使用JSch库来连接SFTP服务器并进行文件操作,以下是一个简单的示例代码:
package com.kehua.util; import com.jcraft.jsch.*; import java.io.*; import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SFTPUtil { private transient Logger log = LoggerFactory.getLogger(this.getClass()); private ChannelSftp sftp; private Session session; /** SFTP 登录用户名*/ private String username; /** SFTP 登录密码*/ private String password; /** 私钥 */ private String privateKey; /** SFTP 服务器地址IP地址*/ private String host; /** SFTP 端口*/ private int port; /** SFTP连接超时时间,单位毫秒 */ private int timeout = 30000; // 默认30秒 /** SFTP会话配置项 */ private Properties sessionConfig = new Properties(); /** SFTP通道连接 */ private Channel channel; /** SFTP通道配置项 */ private ChannelSftp.ChannelSftpConfig config = new ChannelSftp.ChannelSftpConfig(); /** SFTP模式选择 */ private int mode = ChannelSftp.OVERWRITE; // 默认覆盖模式 /** SFTP是否使用压缩 */ private boolean isCompression = false; // 默认不使用压缩 /** SFTP是否保留远程文件属性 */ private boolean preserveAttrs = true; // 默认保留文件属性 /** SFTP是否显示调试信息 */ private boolean debug = false; // 默认不显示调试信息 /** SFTP是否严格主机密钥检查 */ private boolean strictHostKeyChecking = true; // 默认严格检查主机密钥 /** SFTP是否主动模式 */ private boolean activeMode = false; // 默认被动模式 /** SFTP连接是否排它 */ private boolean exclusiveSession = false; // 默认非排它模式 /** SFTP是否使用CDN加速 */ private boolean useCDN = false; // 默认不使用CDN加速 /** SFTP连接池大小 */ private int poolSize = 1; // 默认连接池大小为1 /** SFTP最大重试次数 */ private int maxRetries = 3; // 默认最大重试次数为3次 /** SFTP每次重试间隔时间,单位毫秒 */ private int retryInterval = 1000; // 默认每次重试间隔时间为1秒 /** SFTP是否自动创建目录 */ private boolean autoCreateDir = false; // 默认不自动创建目录 // getter和setter方法省略... }
这个类提供了基本的SFTP连接和文件操作功能,可以根据实际需求进行扩展和定制。
五、常见问题及解答 (FAQs)
Q1: SFTP连接失败怎么办?
A1: 如果SFTP连接失败,可以检查以下几点:确认服务器地址和端口是否正确;检查网络连接是否正常;确认SFTP服务是否已启动;查看防火墙设置是否允许SFTP流量通过;检查用户凭证是否正确,还可以查看服务器日志以获取更多错误信息。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1260342.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复