SFTP服务器的搭建与使用

SFTP服务器的搭建与使用目录一 SFTP 使用场景二 centos7 搭建 SFTP 三 Windows 搭建四 java 代码连接 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 2018 12 14 杨贤宾 nbsp 一 SFTP 使用场景 ftp 是大多数网站的文件传输选择

目录

一、SFTP使用场景

二、centos7搭建SFTP

三、Windows搭建

四、java代码连接

 


                                                                                              2018/12/14 杨贤宾 

一、SFTP使用场景

ftp是大多数网站的文件传输选择工具,但ftp并不是非常安全,并且在centos上搭建的vsftpd也非常的不稳定,偶尔会出现权限问题,例如500、或是账号密码不正确等等。

而SFTP是基于默认的22端口,是ssh内含的协议,只要启动了sshd就可以使用。

建议:更高的效率使用FTP协议,更安全的通信使用SFTP协议。

FTP是一种文件传输协议,一般是为了方便数据共享的。包括一个FTP服务器和多个FTP客户端。FTP客户端通过FTP协议在服务器上下载资源。而SFTP协议是在FTP的基础上对数据进行加密,使得传输的数据相对来说更安全。但是这种安全是以牺牲效率为代价的,也就是说SFTP的传输效率比FTP要低(不过现实使用当中,没有发现多大差别)。个人肤浅的认为就是:

  1. FTP要安装,SFTP不要安装。
  2. SFTP更安全,但更安全带来副作用就是的效率比FTP要低些。

二、centos7搭建SFTP

  1. 创建sftp组
    查看组信息
    groupadd sftp cat /etc/group


     

  2. 创建一个sftp用户mysftp并加入到创建的sftp组中,同时修改mysftp用户的密码  
    useradd -g sftp -s /bin/false mysftp passwd mysftp
  3. 新建目录,指定为mysftp用户的主目录  
    mkdir -p /sftp/mysftp usermod -d /sftp/mysftp mysftp
  4. 编辑配置文件/etc/ssh/sshd_config
    将如下这行用#符号注释掉
    # Subsystem sftp /usr/libexec/openssh/sftp-server

    并在文件最后面添加如下几行内容然后保存(最好放在文件末尾)

    Subsystem sftp internal-sftp Match Group sftp ChrootDirectory /sftp/%u ForceCommand internal-sftp AllowTcpForwarding no X11Forwarding no 




     

  5. 设置Chroot目录权限  
    chown root:sftp /sftp/mysftp #文件夹所有者必须为root,用户组可以不是root chmod 755 /sftp/mysftp #权限不能超过755,否则会导致登录报错,可以是755
  6. 新建一个目录供stp用户mysftp上传文件,这个目录所有者为mysftp所有组为sftp,所有者有写入权限所有组无写入权限  
    mkdir /sftp/mysftp/upload chown mysftp:sftp /sftp/mysftp/upload chmod 755 /sftp/mysftp/upload 
  7. 关闭selinux并重启sshd服务,然后测试  
    setenforce 0 service sshd restart
  8. 在其他服务器上进行验证,sftp 用户名@ip地址  
    sftp -P 10001 mysftp@127.0.0.1 

三、Windows搭建

  1. 下载安装freesshd

    下载地址:

    http://www.freesshd.com/?ctt=download

    下载后安装,一路点击确认就好,安装时产生key,直接点击确认

  2. 安装软件后,以管理员身份打开
    在ssh中地址可以选在本地地址,端口选在22端口,安装之后可以看到key是默认有的
    SFTP服务器的搭建与使用




  3. 新增用户
    SFTP服务器的搭建与使用

  4. 更改认证方式
    SFTP服务器的搭建与使用

  5. 更改sftp服务器根目录
    SFTP服务器的搭建与使用

  6. 启动服务
    SFTP服务器的搭建与使用

  7. 如果上一步无法启动,应该是之前已经启动,端口被占用,需要进入服务,重新启动
    SFTP服务器的搭建与使用

  8. 下载sftp链接工具(xftp或Filezilla等)
    SFTP服务器的搭建与使用

  9. 测试成功
    SFTP服务器的搭建与使用

  10. 异常及解决方案
    输入正确用户名和密码提示denied或者key verification failed.,常规解决方案如下
    删除C:\Users\Administrator下的.ssh文件夹,使用管理员程序重新运行freesshd,再次测试连接




四、java代码连接

package com.kehua.util; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import java.util.Vector; import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.jcraft.jsch.Channel; import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.Session; import com.jcraft.jsch.SftpException; / * 描述: sftp工具类 * @date 2018年12月11日 * @author 杨贤宾 * @version 1.0 */ 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对象 */ public SFTPUtil(String username, String password, String host, int port) { this.username = username; this.password = password; this.host = host; this.port = port; } / * 构造基于秘钥认证的sftp对象 */ public SFTPUtil(String username, String host, int port, String privateKey) { this.username = username; this.host = host; this.port = port; this.privateKey = privateKey; } public SFTPUtil(){} / * 连接sftp服务器 */ public void login(){ try { JSch jsch = new JSch(); if (privateKey != null) { jsch.addIdentity(privateKey);// 设置私钥 } session = jsch.getSession(username, host, port); if (password != null) { session.setPassword(password); } Properties config = new Properties(); config.put("StrictHostKeyChecking", "no"); session.setConfig(config); session.connect(); Channel channel = session.openChannel("sftp"); channel.connect(); sftp = (ChannelSftp) channel; } catch (JSchException e) { e.printStackTrace(); } } / * 关闭连接 server */ public void logout(){ if (sftp != null) { if (sftp.isConnected()) { sftp.disconnect(); } } if (session != null) { if (session.isConnected()) { session.disconnect(); } } } / * 将输入流的数据上传到sftp作为文件。文件完整路径=basePath+directory * @param basePath 服务器的基础路径 * @param directory 上传到该目录 * @param sftpFileName sftp端文件名 * @param in 输入流 */ public void upload(String basePath,String directory, String sftpFileName, InputStream input) throws SftpException{ try { sftp.cd(basePath); sftp.cd(directory); } catch (SftpException e) { //目录不存在,则创建文件夹 String [] dirs=directory.split("/"); String tempPath=basePath; for(String dir:dirs){ if(null== dir || "".equals(dir)) continue; tempPath+="/"+dir; try{ sftp.cd(tempPath); }catch(SftpException ex){ sftp.mkdir(tempPath); sftp.cd(tempPath); } } } sftp.put(input, sftpFileName); //上传文件 } / * 下载文件。 * @param directory 下载目录 * @param downloadFile 下载的文件 * @param saveFile 存在本地的路径 */ public void download(String directory, String downloadFile, String saveFile) throws SftpException, FileNotFoundException{ if (directory != null && !"".equals(directory)) { sftp.cd(directory); } File file = new File(saveFile); sftp.get(downloadFile, new FileOutputStream(file)); } / * 下载文件 * @param directory 下载目录 * @param downloadFile 下载的文件名 * @return 字节数组 */ public byte[] download(String directory, String downloadFile) throws SftpException, IOException{ if (directory != null && !"".equals(directory)) { sftp.cd(directory); } InputStream is = sftp.get(downloadFile); byte[] fileData = IOUtils.toByteArray(is); return fileData; } / * 删除文件 * @param directory 要删除文件所在目录 * @param deleteFile 要删除的文件 */ public void delete(String directory, String deleteFile) throws SftpException{ sftp.cd(directory); sftp.rm(deleteFile); } / * 列出目录下的文件 * @param directory 要列出的目录 * @param sftp */ public Vector     listFiles(String directory) throws SftpException {  		return sftp.ls(directory);  	}  		public static void main(String[] args) throws SftpException, IOException {  		SFTPUtil sftp = new SFTPUtil("userftp", "khyf3@123", "112.74.59.0", 10001);  		sftp.login();  				//上传文件测试		/*File file = new File("E:\\谷歌下载资源\\linux 安装 mysql.html");  		InputStream is = new FileInputStream(file);  		sftp.upload("/upload","code", "linux 安装 mysql.html", is);  		sftp.logout();  */				//下载文件测试		sftp.download("/upload/code", "CODE_0000000000000020.png" ,"D:\\2.PNG");		sftp.logout();	}  }

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/177897.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午6:29
下一篇 2026年3月26日 下午6:30


相关推荐

  • 蓝墨云班课php答案,蓝墨云班课试题库答案

    蓝墨云班课php答案,蓝墨云班课试题库答案蓝墨云班课试题库答案官网安卓版 是一款智能的定位在手机端的线上教学助手 App 是一款功能性非常强大的线上学习类的工具助手 能很好的方便教师进行备课 学生在完成学业后 在家中也能进行线上高效的学习 更能较为高效的进行对自己的线上课程进行管理 与老师机进行实时的互动 蓝墨云班课试题库答案特色 1 线上对综合相关的教育教学活动 能及时的进行管理学员信息 2 采用了全新的线上教学的新模式 将会使学员们进行

    2026年3月19日
    2
  • Cherry Studio 接入 Nano Banana:对话生成图片完整配置指南

    Cherry Studio 接入 Nano Banana:对话生成图片完整配置指南

    2026年3月13日
    2
  • Docker导出镜像为压缩包,并在另一台机器导入压缩包为镜像,即Docker镜像得导入导出

    Docker导出镜像为压缩包,并在另一台机器导入压缩包为镜像,即Docker镜像得导入导出引言当我们在测试环境 本文特指 docker 容器 部署好自己得服务得时候 想在生产环境上部署我们得服务 又害怕环境不一样导致服务不能运行 那么这个时候就可以把我们得容器导出为镜像 然后再把镜像导出为压缩包 接下来把压缩包复制到我们的生产环境 然后在生产环境把压缩包导入为镜像 最后使用此镜像开一个容器 然后在容器内打开我们的服务 那么我们的服务就可以正常运行啦 环境简介系统环境 ubuntu18 04 如果要在新的服务器使用我们的镜像 那么需要新的服务器和你测试环境的服务器的底层系统一致 即如果你测试环

    2026年3月18日
    2
  • mt4交易系统源码_如何将源码加载到mt4里面

    mt4交易系统源码_如何将源码加载到mt4里面1、打开编辑器:第二步,新建一个指标或者eaqml4文件.第三步创建一个ea文件:点击下一步:命名,aaa,点击下一步:全部不打勾,点击下一步:全部不打勾,点击完成:然后全部选中,删除代码:然后选中源码,复制到aaa里面,然后点击编写:就可以在ea里面找到你复制的ea了。指标的源码跟ea的一样,只需要建立一个指标文件,然后复制进去就可以了。如果觉得文章对你有帮助,可以关注公众号,谢谢您…

    2022年5月30日
    94
  • Qt类之QAction

    Qt类之QActionQAction 类 1 QAction QAction constQString amp text QObject parent QAction 类的构造函数之一 利用 text parent 创建 QAction 对象 QAction 对象一般为菜单中的菜单项 比如 文件 菜单中 新建 选项就是一个 QAction 对象 上述构造函数中 text 成员变量即为菜单项所表示的内容 2 可以通过 QWid

    2026年3月16日
    2
  • ftp客户端软件,什么是ftp客户端软件?对于它,你知道些什么?

    ftp客户端软件,什么是ftp客户端软件?对于它,你知道些什么?对于 ftp 客户端软件 你了解多少 其实一般人也接触不到这种软件 ftp 客户端软件主要是针对从事网站管理的工作人员比较有利的一款工具 可以帮助他们快速的解决工作中的问题 方便 简单 快捷又明了的解决问题 工具名称 IIS7 服务器管理工具这款工具是真的好用 童叟无欺的那种好用 在我心里它是排在中文版 javaftp 工具类中的榜首的 它不仅拥有每个 javaftp 工具类都具备的批量管理功能 还具备很多你意想不到的地方 比如定时同步 上传和下载 多任务同时进行 定时备份还能够自动更新 试问哪一个工具能做到这么

    2026年3月26日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号