热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SFTP服务器的搭建与使用

目录一、SFTP使用场景二、centos7搭建SFTP三、Windows搭建四、java代码连接20181214杨贤宾一、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是默认有的

  3. 新增用户

  4. 更改认证方式
  5. 更改sftp服务器根目录
  6. 启动服务
  7. 如果上一步无法启动,应该是之前已经启动,端口被占用,需要进入服务,重新启动
  8. 下载sftp链接工具(xftp或Filezilla等)
  9. 测试成功
  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();}
}


 


推荐阅读
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
  • PHP组合工具以及开发所需的工具
    本文介绍了PHP开发中常用的组合工具和开发所需的工具。对于数据分析软件,包括Excel、hihidata、SPSS、SAS、MARLAB、Eview以及各种BI与报表工具等。同时还介绍了PHP开发所需的PHP MySQL Apache集成环境,包括推荐的AppServ等版本。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 树莓派Linux基础(一):查看文件系统的命令行操作
    本文介绍了在树莓派上通过SSH服务使用命令行查看文件系统的操作,包括cd命令用于变更目录、pwd命令用于显示当前目录位置、ls命令用于显示文件和目录列表。详细讲解了这些命令的使用方法和注意事项。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文介绍了将mysql从5.6.15升级到5.7.15的详细步骤,包括关闭访问、备份旧库、备份权限、配置文件备份、关闭旧数据库、安装二进制、替换配置文件以及启动新数据库等操作。 ... [详细]
author-avatar
mobiledu2502926403
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有