精华内容
下载资源
问答
  • 目前,它支持近90%的远程管理协议,例如vnc,ssh,rdp,telnet,sftp ...它支持在用户使用此项目管理服务器时监视和记录用户操作的可能性!您也可以重播用户诸如视频之类的动作。 希望你喜欢它。 下一个版本:待...
  • sftp

    2016-03-11 13:49:13
    sftp链接服务器的工具类 package com.sxiic.util; import java.util.ArrayList; import java.util.List; import java.util.Properties; import com.jcraft.jsch.Channel; import ...

    sftp链接服务器的工具类

    package com.sxiic.util;



    import java.util.ArrayList;
    import java.util.List;
    import java.util.Properties;


    import com.jcraft.jsch.Channel;
    import com.jcraft.jsch.ChannelSftp;
    import com.jcraft.jsch.JSch;
    import com.jcraft.jsch.Session;
    import com.jcraft.jsch.SftpException;


    /**
     * 参考文档JSch
     * http://www.cnblogs.com/chen1987lei/archive/2010/11/26/1888384.html
     * http://jerval.iteye.com/blog/2150030
     */
    public class SFtpClientUtil {
    private JSch jsch = null;
    private String host;//服务器地址:192.168.1.182
    private int port;//端口:22
    private String username;//登录名:root
    private String password;//密码:goojia123456
    ChannelSftp sftp = null;  
         Channel channel = null;  
         Session sshSession = null; 
         
        public ChannelSftp getSftp() {
    return sftp;
    }
    public void setSftp(ChannelSftp sftp) {
    this.sftp = sftp;
    }




    public SFtpClientUtil(String host, int port, String username,
      String password) {
     this.host = host;
     this.port = port;
     this.username = username;
     this.password = password;
    }
         
         
    public static void main(String[] args) {
    //connect("192.168.1.182", 22, "root", "goojia123456");
    SFtpClientUtil s = new SFtpClientUtil("192.168.1.182", 22, "root", "goojia123456");
    s.connect();
    s.closeConnect();
     
    }
    /**
     * 链接到服务器
     */
    public boolean connect() {  
           try {  
               JSch jsch = new JSch();  
               jsch.getSession(username, host, port);  
               sshSession = jsch.getSession(username, host, port);  
               sshSession.setPassword(password);  
               Properties sshConfig = new Properties();  
               sshConfig.put("StrictHostKeyChecking", "no");  
               sshSession.setConfig(sshConfig);  
               sshSession.connect();  
               channel = sshSession.openChannel("sftp");  
               channel.connect();  
               sftp = (ChannelSftp) channel; 
               return true;
               
           } catch (Exception e) {  
               e.printStackTrace(); 
               return false;
           }
       } 

    /**
     * 链接到服务器
     */
    public void closeConnect() {  
    closeChannel(sftp);  
             closeChannel(channel);  
             closeSession(sshSession); 

     
    public static void closeChannel(Channel channel) {  
           if (channel != null) {  
               if (channel.isConnected()) {  
                   channel.disconnect();  
               }  
           }  
    }  
     
    public static void closeSession(Session session) {  
        if (session != null) {  
            if (session.isConnected()) {  
                session.disconnect();  
            }  
        }  
    }  
     
    //是否存在文件夹
    public boolean ifdirectory(String directory){
    try{
    sftp.cd(directory);
    return true;
    }catch(SftpException sException){
    if(sftp.SSH_FX_NO_SUCH_FILE == sException.id){
    return false;
    }
    return false;
    }  
    }
     
     

    }


    spring mvc调用,将服务器日志文件的内容展示出来


    package com.sxiic.controller;


    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Properties;
    import java.util.Vector;


    import javax.servlet.http.HttpServletRequest;


    import org.apache.commons.lang.StringUtils;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;


    import com.jcraft.jsch.Channel;
    import com.jcraft.jsch.ChannelSftp;
    import com.jcraft.jsch.ChannelSftp.LsEntry;
    import com.jcraft.jsch.JSch;
    import com.jcraft.jsch.Session;
    import com.jcraft.jsch.SftpException;
    import com.sxiic.util.SFtpClientUtil;


    //http://lavasoft.blog.51cto.com/62575/100386/
    //http://jerval.iteye.com/blog/2150030
    //http://www.cnblogs.com/chen1987lei/archive/2010/11/26/1888384.html


    @Controller
    @RequestMapping("/sftpclient")
    public class SFtpClientController extends BaseController{
     
    /**
    * 后台用户列表
    */
    @RequestMapping(value="/testsftp/**",method= RequestMethod.GET)
    public String testFtp(HttpServletRequest request,Model model){
    //connect("192.168.1.182", 22, "root", "goojia123456","/home","3-8.log");
    String url = request.getRequestURI().substring(request.getContextPath().length()+"/sftpclient/testsftp".length(),request.getRequestURI().length());
    String logname = "";
    if(url.indexOf('.') != -1){
    logname = url.substring(url.lastIndexOf("/")+1, url.length());
    url = url.substring(0, url.lastIndexOf("/"));  
    }
    SFtpClientUtil s = new SFtpClientUtil("192.168.1.182", 22, "root", "goojia123456");
    ChannelSftp sftp = null;
    String dir = "/home";
    dir+=url;
    List<String> dirList = new ArrayList<String>();
    List<String> fileList = new ArrayList<String>();
    List<String> contentlist = new ArrayList<String>();
    List<String> fileanddirList = new ArrayList<String>();
    try {
      if (s.connect()) {
      sftp = s.getSftp();
      
      if(StringUtils.isBlank(logname)){
      //返回的是目录
      Vector<LsEntry> listFiles= sftp.ls(dir);
      for (LsEntry entry:listFiles) {  
                   if(entry.getFilename().indexOf('.') == -1){
                    System.out.println(entry.getFilename()); 
                    dirList.add(entry.getFilename());
                   }else{
                    System.out.println(entry.getFilename()); 
                    fileList.add(entry.getFilename());
                   }
                   if(entry.getFilename().equals(".") || entry.getFilename().equals("..")){
                   
                   }else{
                    fileanddirList.add(entry.getFilename());
                   }
               }
      
      //return 目录;
      model.addAttribute("resul", 1);
      model.addAttribute("fdlist", fileanddirList);
      model.addAttribute("url", url);
      return "sftp_log_list";
      }else{
      sftp.cd(dir);
      //返回的是log内容
      InputStream out= sftp.get(logname);
      String content = readInputStream(out);
      String[] contentarray = content.split("\\|\\|");
      for(int i=0;i<contentarray.length;i++){
      //System.out.println(contentarray[i]);
      contentlist.add(contentarray[i]);
      }
      
      //return 文本内容; 
      model.addAttribute("resul", 2);
      model.addAttribute("contentlist", contentlist);
      System.out.println("数据查询完毕!");
      return "sftp_log_list";
      }
       
      }
    } catch (Exception e) {
      e.printStackTrace();
      model.addAttribute("resul", 3);
      model.addAttribute("falireson", e.getMessage());
      return "sftp_log_list";
    }finally{
    s.closeConnect();
    }
    model.addAttribute("resul", 4);
    model.addAttribute("falireson", "直接执行finally");
    return "sftp_log_list";
    }
     

        public static String readInputStream(InputStream inputStream) {
        BufferedReader reader = null;
        StringBuffer sb = new StringBuffer();
        try {
        reader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
           String line = null;
            while ((line = reader.readLine()) != null) {
            //将文本打印到控制台
            sb.append(line);
            }

    } catch (Exception e) {
    // TODO: handle exception
    e.printStackTrace();  
    }finally {  
                try {  
                reader.close();  
                    //bw.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
            return sb.toString();
        }

    }


    jsp页面展示

    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>


    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>


    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        <title>三弦转换后台</title>
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">


    <link href="resources/css/bg.css" rel="stylesheet" type="text/css" />
    <link href="resources/css/base.css" rel="stylesheet" type="text/css" />
    <link href="resources/css/style.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript" src="resources/js/jquery-1.5.1.min.js"></script>
    <script  src="resources/js/colResizable-1.3.min.js"></script>
     <script type="text/javascript" src="resources/js/My97DatePicker/WdatePicker.js"></script>
     <link href="resources/js/jquery-jbox/2.3/Skins/Bootstrap/jbox.css" rel="stylesheet" />
    <script src="resources/js/jquery-jbox/2.3/jquery.jBox-2.3.min.js" type="text/javascript"></script>
    <script src="resources/js/jquery-jbox/2.3/i18n/jquery.jBox-zh-CN.min.js" type="text/javascript"></script>
    </head>


    <body class="h_body">
    <div id="main-box">
    <div class="main-content">
    <!-- 面包屑 -->
    <div id="bread">平台 > 日志管理 > 日志列表 <i class="bread-icon"></i></div>

    <table id="searchTable">
    <thead>
    <tr>
    <th width="50%">日志</th>
    </tr>
    </thead>
    <tbody>
    <c:choose>
          <c:when test="${resul==1}">
    <c:forEach items="${fdlist}" var="fd"> 
    <tr>
    <td><a href="sftpclient/testsftp${url}/${fd}">${fd}</a></td>
    </tr>
    </c:forEach>
          </c:when>
          <c:when test="${resul==2}">
               <c:forEach items="${contentlist}" var="content"> 
    <tr>
    <td>${content}</td>
    </tr>
    </c:forEach>
          </c:when>
          <c:otherwise>
             <tr>
    <td>${resul}+"--"${falireson}</td>
     </tr>    
          </c:otherwise>
    </c:choose>
    </tbody>
    </table>


    </div>
    </div>


    <script type="text/javascript" >


    </script>
    </body>
    </html>

    展开全文
  • java web 实现Sftp文件上传下载

    千次阅读 2019-10-08 10:12:26
     public static Properties properties = LoadProperties.getProperties("/config/sftp.properties");  private static Channel channel;  private static Session sshSession;  /**  * 登陆SFTP服务器 ...

    思路

    1.首先连接ftp服务器

    2.连接到服务器之后如何上传文件

    3.上传后如何获取文件

    4.文件格式是图片如何展示到客户端浏览器

    5.服务端代码如何接收客户端的文件以及如何返回响应信息给浏览器

     主要jar包依赖文件

    <dependency>
          <groupId>com.jcraft</groupId>
          <artifactId>jsch</artifactId>
          <version>0.1.54</version>
     </dependency>
            <!-- jsch 所依赖的jar包  -->
    <dependency>
          <groupId>com.jcraft</groupId>
          <artifactId>jzlib</artifactId>
          <version>1.1.1</version>
      </dependency>

    public class SftpUtils {

       private static final Logger log = LoggerFactory.getLogger(SftpUtils.class);
       private static ChannelSftp sftp;
       public static Properties properties = LoadProperties.getProperties("/config/sftp.properties");
       private static Channel channel;
       private static Session sshSession;

        /**
         * 登陆SFTP服务器
         * @return
         */
        public static boolean getConnect() throws Exception{
            log.info("进入SFTP====");
            boolean result = false;
            JSch jsch = new JSch();
            //获取sshSession  账号-ip-端口,从properties文件中获取连接ftp服务器的相关信息
            sshSession  =jsch.getSession(properties.getProperty("user"), properties.getProperty("ip"), Integer.parseInt(properties.getProperty("port")));
            //添加密码
            sshSession.setPassword(properties.getProperty("password"));
            Properties sshConfig = new Properties();
            //严格主机密钥检查
            sshConfig.put("StrictHostKeyChecking", "no");

            sshSession.setConfig(sshConfig);
            //开启sshSession链接
            sshSession.connect();
            //获取sftp通道
            channel = sshSession.openChannel("sftp");
            //开启
            channel.connect();
            sftp = (ChannelSftp) channel;
            result = true;
            return result;
        }
        
        /**
                 * 文件上传
         * @param inputStream 上传的文件输入流
         * @param fileCategory 存储文件目录分类
         * @return
         */
        public static String upload(InputStream inputStream, String fileCategory, String fileName) throws Exception{
            String destinationPath = properties.getProperty("destinationPath")+fileCategory;
            try {
                sftp.cd(destinationPath);
                //获取随机文件名
                fileName  = UUID.randomUUID().toString().replace("-", "") + fileName;
                //文件名是 随机数加文件名的后5位
                sftp.put(inputStream, fileName);
            }finally {
                sftp.disconnect();
            }
            return fileName;
        }
     
        /**
             * 下载文件
        *
        * @param downloadFilePath 下载的文件完整目录
        * @param saveFile     保存在本地的文件路径
        * @return 返回的是文件
        */
        public static File download(String downloadFilePath, String saveFile) {
            FileOutputStream fileOutputStream = null;
            try {
                int i = downloadFilePath.lastIndexOf('/');
                if (i == -1)
                    return null;
                sftp.cd(downloadFilePath.substring(0, i));
                File file = new File(saveFile);
                fileOutputStream = new FileOutputStream(file);
                sftp.get(downloadFilePath.substring(i + 1), fileOutputStream);
                return file;
            } catch (Exception e) {
                log.error(e.getMessage());
                return null;
            }finally {
                sftp.disconnect();
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        
        
        /**
             * 获取ftp服务器    (图片)文件流
         * @param downloadFilePath ftp文件上的文件全路径,包括具体文件名 a/b/c.png
         * @return 返回的是文件流
         */
        public static InputStream download(String downloadFilePath) {
            int i = downloadFilePath.lastIndexOf('/');
            InputStream inputStream = null;
            if (i == -1)
                return null;
            try {
                sftp.cd(downloadFilePath.substring(0, i));
                inputStream = sftp.get(downloadFilePath.substring(i + 1));
            } catch (SftpException e) {
                log.error("获取ftp服务文件流发生异常!");
                e.printStackTrace();
            }
            return inputStream;
        }
        
        /* * 断开SFTP Channel、Session连接
         * @throws Exception
         *
         */
        public static void disconnect() {
            if (SftpUtils.sftp != null) {
                if (sftp.isConnected()) {
                    sftp.disconnect();
                    log.info("sftp is closed already");
                }
            }
            if (SftpUtils.sshSession != null) {
                if (SftpUtils.sshSession.isConnected()) {
                    SftpUtils.sshSession.disconnect();
                    log.info("sshSession is closed already");
                }
            }
        }
        
        /**
         * 文件流转为base64字节码
         * @param in
         * @return
         */
        public static String inputStreamtoBase64(InputStream in) throws Exception{
            byte[] bytes = IOUtils.toByteArray(in);
            String base64str = Base64.getEncoder().encodeToString(bytes);
            return base64str;
        }

        /** 删除sftp文件
         * @param directPath 需要删除的文件目录
         * @param fileName 需要删除的文件
         * @return
         **/
        public static void deleteFile(String directPath, String fileName) throws Exception{
            //进入需要删除的文件目录下 
            sftp.cd(directPath);
            sftp.rm(fileName);
        }
        
       
        /**
             * 列出某目录下的文件名
         * @param directory 需要列出的文件目录(sftp服务器目录下的)
         * @return  List<String> 返回的文件名列表
         * @throws Exception
         */
        public static List<String> listFiles(String directory) throws Exception {
            Vector fileList;
            List<String> fileNameList = new ArrayList<String>();
            fileList = sftp.ls(directory);
            Iterator it = fileList.iterator();
            while(it.hasNext())
            {
                String fileName = ((LsEntry)it.next()).getFilename();
                if(".".equals(fileName) || "..".equals(fileName)){
                continue;
                }
                fileNameList.add(fileName);

            }
            return fileNameList;
            }

    总结:上面是一个ftp工具类,包括ftp连接,文件上传,文件下载,ftp服务硬盘目录下的文件查询

    二,服务端后台代码

    /**
         * 上传文件
         * @param multipartFile 客户端上传的文件
         * @param request
         * @param response
         * @return
         */
        @PostMapping("uploadFile")
        @ResponseBody
        public String uploadFile(@RequestParam("multipartFile") MultipartFile multipartFile, HttpServletRequest request, HttpServletResponse response) {
            //连接sftp服务
            String fileName = null;
            try {
                SftpUtils.getConnect();
                //上传的文件所属类型 banner, mobile, pc, share四种
                //如果未明确默认存放在ftp服务器的share文件目录下
                String fileCategory = request.getParameter("fileCategory")== null ? "share" : request.getParameter("fileCategory");
                //上传的文件名
                fileName = multipartFile.getOriginalFilename();
                int index = fileName.lastIndexOf(".");
                String nameSuffix = fileName.substring(index, fileName.length());
                //禁止上传.exe文件
                if(".exe".equalsIgnoreCase(nameSuffix)) {
                    return renderResult(Global.FALSE, text("上传的文件格式不支持!")); 
                }
                InputStream inputStream = multipartFile.getInputStream();
                String filePath = SftpUtils.upload(inputStream, fileCategory, fileName);
                SftpUtils.disconnect();
                //需要保存到数据库的文件名称
                fileName = fileCategory+"/"+filePath;
            } catch (Exception e) {
                e.printStackTrace();
                logger.error("文件上传过程中发生异常!");
                return renderResult(Global.FALSE, text("上传失败!"));
            }
                return renderResult(Global.TRUE, text(fileName));
        }
        
        /**
         * 下载文件
         * @param request
         * @param response
         * @return
         */
        @RequestMapping("downLoad")
        @ResponseBody
        public Map<String, String> downLoad(HttpServletRequest request, HttpServletResponse response) {
            Map<String, String> paraMap = new HashMap<String, String>();
            paraMap.put("result", "true");
            paraMap.put("msg", "文件下载成功");
            //获取需要下载的文件名称
            //正式情况下是从表中获取,文件格式,文件名称,存入数据库中
            //测试某文件名称
            String fileName = "share/eae3b1a4a6fe4bb48af11381add03c59textJGY.jpg";
            //判断需要下载的文件是否是图片格式,如果是图片则传Base64格式给浏览器
            String fileType = "jpg";
            String oldName = "JGY.jpg";
            String [] imagesTypes = {"jpg", "JPG", "png", "PNG", "bmp", "BMP", "gif", "GIF"};
            boolean flag = false;
            for (int i = 0; i < imagesTypes.length; i++) {
                if(fileType.equalsIgnoreCase(imagesTypes[i])) {
                    flag = true;
                    break;
                }
            }
            try {
                SftpUtils.getConnect();
            } catch (Exception ftpexp) {
                logger.error("ftp连接时发生异常!");
                ftpexp.printStackTrace();
                paraMap.put("result", "false");
                paraMap.put("msg", "ftp连接时发生异常!");
                return paraMap;
            }
            //获取properties文件中ftp服务器存放的路径
            String direct = SftpUtils.properties.getProperty("destinationPath");
            //获取下载文件的文件流            
            String downloadFilePath = direct+fileName;
            InputStream inputStream = SftpUtils.download(downloadFilePath);
            //图片转为base64
            if(flag) {
                try {
                    //文件流转为base64
                    String base64String = SftpUtils.inputStreamtoBase64(inputStream);
                    paraMap.put("base64", base64String);
                } catch (Exception e) {
                    logger.error("文件下载出现异常!");
                    e.printStackTrace();
                    paraMap.put("result", "false");
                    paraMap.put("msg", "文件下载失败!");
                    return paraMap;
                }
                //非图片文件就直接浏览器下载
            } else {
                 String agent = request.getHeader("user-agent");
                 try {
                     if(StringUtils.contains(agent, "MSIE")||StringUtils.contains(agent,"Trident")){//IE浏览器
                         oldName = URLEncoder.encode(oldName,"UTF8");
                         System.out.println("IE浏览器");
                     }else if(StringUtils.contains(agent, "Mozilla")) {//google,火狐浏览器
                         oldName = new String(oldName.getBytes(), "ISO8859-1");
                     }else {
                         oldName = URLEncoder.encode(oldName,"UTF8");//其他浏览器
                     }
                     response.reset();//重置 响应头
                     response.setContentType("application/x-download");//告知浏览器下载文件,而不是直接打开,浏览器默认为打开
                     response.addHeader("Content-Disposition" ,"attachment;filename=\"" +oldName+ "\"");//下载文件的名称
                     byte[] b = new byte[1024];
                     int len;
                     while((len = inputStream.read(b)) > 0) {
                         response.getOutputStream().write(b, 0, len);;
                     }
                 }catch (Exception e) {
                    e.printStackTrace();
                    paraMap.put("result", "false");
                    paraMap.put("msg", "文件下载失败!");
                    return paraMap;
                 }finally {
                     try {
                        response.getOutputStream().close();
                    } catch (IOException e) {
                        logger.error("文件输出流关闭发生异常!");
                        e.printStackTrace();
                    }
                     SftpUtils.disconnect();
                }
            }
            return paraMap;
        }

    展开全文
  • 他创造性地把RSA公钥体系的方便和传统加密体系的高速度结合起来,并且在数字签名和密钥认证管理机制上进行巧妙的设计,从而使PGP成为流行的公钥加密软件包。PGP是一个基于RSA公钥加密体系的邮件加密软件,可以用于...
  • 容器部署: docker run --name some-sftpgo -p 8080:8090 -e SFTPGO_HTTPD__BINDINGS__0__PORT=8090 -p 2022:2022 -d "drakkan/sftpgo:v2.1.0" 浏览器打开配置界面 ... 1、-e SFTPGO_HTTPD__BINDINGS...2、默认sftp端口号

    功能介绍

    sftpgo-web项目gitlab项目地址:https://github.com/drakkan/sftpgo

    功能很强大,包括并且不限于 FTP,FTPS,SFTP,WebDAV,SCP,Git…… 还支持 S3,GCP,Azure 等服务作为存储后端,保证数据安全。并且还提供了完整的 RESTful API、普鲁米修斯监控指标、灵活的用户鉴权方式、用户各自目录权限配置、容量按需分配按需限制、上传下载速度限制、客户端数限制、登录 IP 限制、文件变更推送通知…… 嗯,简而言之你甚至可以用它开卖云盘了🤣
    总结下:登录IP限制、使用时间限制、文件大小限制、传输速率限制、认证方式限制、容量大小限制、连接数限制、上传下载限制、上传文件格式限制哈哈😊

    容器部署

    创建自定义配置文件

    mkdir /opt/sftp/config && cd /opt/sftpgo/config
    chmod 777 /opt/sftp -R
    chmod 666 /opt/sftp
    

    vim sftpgo.json

    {
      "common": {
        "idle_timeout": 15,
        "upload_mode": 0,
        "actions": {
          "execute_on": [],
          "execute_sync": [],
          "hook": ""
        },
        "setstat_mode": 0,
        "temp_path": "",
        "proxy_protocol": 0,
        "proxy_allowed": [],
        "startup_hook": "",
        "post_connect_hook": "",
        "max_total_connections": 0,
        "max_per_host_connections": 0,
        "defender": {
          "enabled": false,
          "ban_time": 30,
          "ban_time_increment": 50,
          "threshold": 15,
          "score_invalid": 2,
          "score_valid": 1,
          "score_limit_exceeded": 3,
          "observation_time": 30,
          "entries_soft_limit": 100,
          "entries_hard_limit": 150,
          "safelist_file": "",
          "blocklist_file": ""
        },
        "rate_limiters": [
          {
            "average": 0,
            "period": 1000,
            "burst": 1,
            "type": 2,
            "protocols": [
              "SSH",
              "FTP",
              "DAV",
              "HTTP"
            ],
            "generate_defender_events": false,
            "entries_soft_limit": 1000,
            "entries_hard_limit": 1500
          }
        ]
      },
      "sftpd": {
        "bindings": [
          {
            "port": 2022,
            "address": "",
            "apply_proxy_config": true
          }
        ],
        "max_auth_tries": 0,
        "banner": "100.3  感谢关注!",
        "host_keys": [],
        "kex_algorithms": [],
        "ciphers": [],
        "macs": [],
        "trusted_user_ca_keys": [],
        "login_banner_file": "",
        "enabled_ssh_commands": [
          "md5sum",
          "sha1sum",
          "cd",
          "pwd",
          "scp"
        ],
        "keyboard_interactive_auth_hook": "",
        "password_authentication": true
      },
      "ftpd": {
        "bindings": [
          {
            "port": 0,
            "address": "",
            "apply_proxy_config": true,
            "tls_mode": 0,
            "force_passive_ip": "",
            "client_auth_type": 0,
            "tls_cipher_suites": []
          }
        ],
        "banner": "",
        "banner_file": "/etc/sftpgo/welcome",
        "active_transfers_port_non_20": true,
        "passive_port_range": {
          "start": 50000,
          "end": 50100
        },
        "disable_active_mode": false,
        "enable_site": false,
        "hash_support": 0,
        "combine_support": 0,
        "certificate_file": "",
        "certificate_key_file": "",
        "ca_certificates": [],
        "ca_revocation_lists": []
      },
      "webdavd": {
        "bindings": [
          {
            "port": 0,
            "address": "",
            "enable_https": false,
            "client_auth_type": 0,
            "tls_cipher_suites": [],
            "prefix": "",
            "proxy_allowed": []
          }
        ],
        "certificate_file": "",
        "certificate_key_file": "",
        "ca_certificates": [],
        "ca_revocation_lists": [],
        "cors": {
          "enabled": false,
          "allowed_origins": [],
          "allowed_methods": [],
          "allowed_headers": [],
          "exposed_headers": [],
          "allow_credentials": false,
          "max_age": 0
        },
        "cache": {
          "users": {
            "expiration_time": 0,
            "max_size": 50
          },
          "mime_types": {
            "enabled": true,
            "max_size": 1000
          }
        }
      },
      "data_provider": {
        "driver": "sqlite",
        "name": "sftpgo.db",
        "host": "",
        "port": 0,
        "username": "",
        "password": "",
        "sslmode": 0,
        "connection_string": "",
        "sql_tables_prefix": "",
        "track_quota": 2,
        "delayed_quota_update": 0,
        "pool_size": 0,
        "users_base_dir": "/srv/sftpgo/data",
        "actions": {
          "execute_on": [],
          "hook": ""
        },
        "external_auth_hook": "",
        "external_auth_scope": 0,
        "credentials_path": "credentials",
        "prefer_database_credentials": false,
        "pre_login_hook": "",
        "post_login_hook": "",
        "post_login_scope": 0,
        "check_password_hook": "",
        "check_password_scope": 0,
        "password_hashing": {
          "bcrypt_options": {
            "cost": 10
          },
          "argon2_options": {
            "memory": 65536,
            "iterations": 1,
            "parallelism": 2
          },
          "algo": "bcrypt"
        },
        "password_caching": true,
        "update_mode": 0,
        "skip_natural_keys_validation": false,
        "create_default_admin": false
      },
      "httpd": {
        "bindings": [
          {
            "port": 8080,
            "address": "",
            "enable_web_admin": true,
            "enable_web_client": true,
            "enable_https": false,
            "client_auth_type": 0,
            "tls_cipher_suites": [],
            "proxy_allowed": []
          }
        ],
        "templates_path": "templates",
        "static_files_path": "static",
        "backups_path": "/srv/sftpgo/backups",
        "web_root": "",
        "certificate_file": "",
        "certificate_key_file": "",
        "ca_certificates": [],
        "ca_revocation_lists": []
      },
      "telemetry": {
        "bind_port": 10000,
        "bind_address": "127.0.0.1",
        "enable_profiler": false,
        "auth_user_file": "",
        "certificate_file": "",
        "certificate_key_file": "",
        "tls_cipher_suites": []
      },
      "http": {
        "timeout": 20,
        "retry_wait_min": 2,
        "retry_wait_max": 30,
        "retry_max": 3,
        "ca_certificates": [],
        "certificates": [],
        "skip_tls_verify": false,
        "headers": []
      },
      "kms": {
        "secrets": {
          "url": "",
          "master_key_path": ""
        }
      }
    }
    
    docker run --name some-sftpgo     -p 8080:8080   -v /opt/sftp/data:/srv/sftpgo -v /opt/sftp/home:/var/lib/sftpgo  -v /opt/sftp/config:/etc/sftpgo -p 2022:2022 -e SFTPGO_SFTPD__TLS_MODE=0  -d "drakkan/sftpgo:v2.1.0"
    
    1、默认sftp端口号是2022
    2-e SFTPGO_SFTPD__TLS_MODE=0 关闭tls认证
    

    浏览器打开web界面

    http://192.168.3.5:8080/web/admin/setup
    

    第一次登录sftpgo服务,需要重置下密码
    在这里插入图片描述

    这里需要注意的是,当我们在一个新的浏览器打开sftpgo-web服务,url将变成client登录

    http://192.168.84.156:8080/web/client/login
    

    那如果用admin用户登录将不会成功。需要把url改成下面即可使用管理员登录

    http://192.168.84.156:8080/web/admin/login
    

    同理,如果是普通用户登录sftpgo-web服务,使用下面url

    http://192.168.84.156:8080/web/client/login
    

    普通登录方式
    管理员用户是不能登录的,需要登录web界面后使用admin用户创建一个普通用户

    ip:192.168.84.156
    协议:sftp
    端口号:2022
    用户:dongweizhen
    密码:xxxxxx

    优化参数

    sftpgo服务容器安装的配置文件位置:

    /etc/sftpgo/sftpgo.json
    

    配置文件详解https://github.com/drakkan/sftpgo/blob/main/docs/full-configuration.md

    1、连接限制

    默认服务没有连接数量,但是有单个主机的连接数量

    "max_total_connections": 0,
    "max_per_host_connections": 20,
    

    如果不限制单主机连接数量可以把"max_per_host_connections": 20,改成"max_per_host_connections": 0

    2、请求返回设置

    "banner": "100.3  感谢关注!",
    

    根据文档介绍
    banner, string. Identification string used by the server. Leave empty to use the default banner. Default SFTPGo_, for example SSH-2.0-SFTPGo_0.9.5
    如果不修改,会把服务的信息暴露出去

    展开全文
  • 文章目录 概况 FTP服务器搭建 SFTP服务器搭建 HTTPD服务器搭建 SVN服务器搭建 概况 ​ 本文档基于xx项目测试需搭建文件共享服务器为背景编写,主要为简单的搭建流程,更多的原理性内容与配置内容可自行查阅网络资料...

    概况

    ​ 本文档基于xx项目测试需搭建文件共享服务器为背景编写,主要为简单的搭建流程,更多的原理性内容与配置内容可自行查阅网络资料。

    ​ 常见的服务器主要为FTP、SFTP、SVN,HTTPD均可以达到其目的。这里仅针对Debian系列的Linux发行版,例如UOS、Deepin、Ubuntu等,其他发行版方法差异不大,在包管理工具和配置文件可能存在微小差异,随机应变即可!

    ​ 其中FTP与SFTP极为相似,甚至语法都一样,这里简单说一下它们的区别。FTP是大多数网站的文件传输选择工具,但FTP并不是非常安全,而SFTP是基于默认的22端口,是ssh内含的协议,只要启动了sshd就可以使用。

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

    ​ FTP是一种文件传输协议,一般是为了方便数据共享的。包括一个FTP服务器和多个FTP客户端。FTP客户端通过FTP协议在服务器上下载资源。而SFTP协议是在FTP的基础上对数据进行加密,使得传输的数据相对来说更安全。但是这种安全是以牺牲效率为代价的,也就是说SFTP的传输效率比FTP要低,文件不大的话,应该体现不出这个差异。

    FTP服务器搭建

    • 安装
    $ sudo apt install -y vsftpd
    
    • 配置
    $ vi /etc/vsftpd.conf
    
    # 以下配置匿名用户拥有ftp服务器可读写权限,=YES为开放权限,=NO为关闭权限,注意需配置项去掉注释'#'
    listen=NO
    listen_ipv6=YES
    anonymous_enable=YES # 默认配置项,允许匿名登录
    write_enable=YES # 默认配置项,本地用户写权限
    anon_upload_enable=YES # 默认配置项,匿名用户上传文件权限
    anon_mkdir_write_enable=YES # 默认配置项,匿名用户创建/修改文件权限
    anon_other_write_enable=YES # 新增配置项,匿名用户删文件权限
    anon_root=/home/mars/ftp # 新增配置项,自定义ftp根目录地址
    anon_umask=000 # 新增配置项,匿名用户创建文件的控制权为满权限
    
    # 匿名用户一般不开放修改、删除文件权限,看个人需求修改
    
    • 本地ftp目录授权
    $ chmod 755 /home/mars/ftp
    
    # vsftpd存在安全策略,该目录如果授权777会存在风险,所以授权777时,ftp服务器会异常,注意!!!
    
    • 重启vsftpd服务
    service vsftpd restart 
    
    • 此时放入testfile文件至ftp服务器目录/home/mars/ftp
    • wget下载ftp服务器x.x.x.x文件:`testfile
    $ wget ftp://x.x.x.x/testfile
    
    • END

    备注:更详细内容可参考ftp服务器搭建-V1.0.mdftp服务器无法连接解决办法V2.0.md

    SFTP服务器搭建

    • 安装
    $ sudo su # 切root用户,后续命令使用root用户执行
    $ apt install -y openssh-server
    
    • 创建sftp
    $ groupadd sftp  
    
    • sftp组下创建用户mysftp并设置密码,该用户仅用于sftp,需禁止其登录
    $ useradd -g sftp -s /sbin/nologin mysftp
    $ passwd mysftp
    
    • 创建sftp目录
    $ mkdir -p /sftpdir/mysftp
    
    • 配置sshd_config
    $ vim /etc/ssh/sshd_config  
    
    # 注释掉以下行
    Subsystem    sftp   /usr/libexec/openssh/sftp-server 
    
    # 末尾添加如下几行
    
    Subsystem    sftp   internal-sftp    # 这行指定使用sftp服务使用系统自带的internal-sftp
    Match Group sftp     # 匹配sftp组的用户,匹配多个组用逗号分割,也可以匹配用户:Match User mysftp
    ChrootDirectory /sftpdir/%u   # 将用户的根目录指定到/sftpdir/%u,%u代表用户名,这样用户就只能在/data/sftp/%u下活动
    ForceCommand   internal-sftp  # 指定sftp命令
    AllowTcpForwarding no  # 这两行是禁止用户使用端口转发,允许请删掉
    X11Forwarding no
    
    • 设定权限
    $ chown root:sftp /sftp
    $ chown root:sftp /sftp/mysftp
    $ chmod 755 -R /sftp
    
    # 目录的权限需注意:
    # 指定的目录以及所有上级目录,拥有者都只能是root,且仅root有写入权限(755)
    
    # 所以遵循以上原则
    # 1、我们将mysftp与父目录sftp的属主设置为了root,属组设置为sftp
    # 2、我们将mysftp与父目录sftp的权限设置为755,所有者root有写入权限,而所有组sftp与其他用户无写入权限
    
    • 建立SFTP用户登入后可写入的目录
    # 这个目录所有者为mysftp,所有组为sftp,所有者有写入权限,而所有组无写入权限
    $ mkdir /sftp/mysftp/mydir
    $ chown mysftp:sftp /sftp/mysftp/mydir
    $ chmod 755 /sftp/mysftp/mydir
    
    • 重启ssh服务
    service ssh restart  
    
    • END

    备注:以上设置仅仅是一种场景的方案,可根据自己的需求配置不同方案

    HTTPD服务器搭建

    ​httpd是unix系统(例如Unix,bsd)apache的可执行文件的文件名,一般在这些系统中httpd指的就是apache。

    httpd和apache的区别关系

    • apache作为web服务,像win下面的IIS一样;apache2以上版本改称为httpd。

    • httpd和apache关系,简单理解就是apache2以上版本改称为httpd。

    httpd

    ​ httpd是Apache超文本传输协议(HTTP)服务器的主程序。被设计为一个独立运行的后台进程,它会建立一个处理请求的子进程或线程的池。通常,httpd不应该被直接调用,而应该在类Unix系统中由 apachectl 调用,在Windows NT/2000/XP/2003中作为服务运行和在Windows 95/98/ME中作为控制台程序运行。

    apache

    ​ Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。

    • 安装apache2
    $ sudo apt install -y apache2
    
    • Apache2的默认访问端口为80,当端口被占用时需要更改端口,未被占用则略过。主要修改配置文件/etc/apache2/ports.conf/etc/apache2/sites-available/000-default.conf
    $ sudo vi /etc/apache2/ports.conf 
    #__________________________________________________________________________
    # If you just change the port or add more ports here, you will likely also
    # have to change the VirtualHost statement in
    # /etc/apache2/sites-enabled/000-default.conf
    
    # Listen 80
    Listen xx 
    # :wq 保存退出_______________________________________________________________
    
    
    $ vi /etc/apache2/sites-available/000-default.conf
    #__________________________________________________________________________
    # <VirtualHost *:80>
    <VirtualHost *:xx>
            # The ServerName directive sets the request scheme, hostname and port that
            # the server uses to identify itself. This is used when creating
    # :wq 保存退出_______________________________________________________________
    
    • 重启服务器并查看状态是否为Active: active (running)
    $ service apache2 restart
    $ service apache2 status
    ● apache2.service - The Apache HTTP Server
       Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
       Active: active (running) since Fri 2021-05-28 17:58:34 CST; 2h 50min ago
         Docs: https://httpd.apache.org/docs/2.4/
    
    • apache服务器的默认目录在/var/www/html/,有两种下载方式
      • 可视化:删除其目录下index.html文件,把需要共享的文件放入该目录,浏览器访问搭建服务器设备IPhttp://x.x.x.x,即可看到文件进行下载。
      • 命令行:把需要共享的文件testfile放入该目录,执行命令:wget http://x.x.x.x/testfile
    • END

    SVN服务器搭建

    ​ SVN是subversion的缩写,是一个开放源代码的版本控制系统,通过采用分支管理系统的高效管理,简而言之就是用于多个人共同开发同一个项目,实现共享资源,实现最终集中式的管理。

    • 安装
    $ sudo apt install -y subsersion
    
    • 创建SVN版本库
    $ sudo mkdir -p /usr/svn/repository
    $ sudo chmod -R 777 /repository
    $ sudo svnadmin create /usr/svn/repository
    $ sudo chmod -R 777 /usr/svn/repository/db
    
    • 设置访问权限
    $ sudo vi /usr/svn/repository/conf/svnserve.conf
    
    [general]
    ### The anon-access and auth-access options control access to the
    ### repository for unauthenticated (a.k.a. anonymous) users and
    ### authenticated users, respectively.
    ### Valid values are "write", "read", and "none".
    ### Setting the value to "none" prohibits both reading and writing;
    ### "read" allows read-only access, and "write" allows complete 
    ### read/write access to the repository.
    ### The sample settings below are the defaults and specify that anonymous
    ### users have read-only access to the repository, while authenticated
    ### users have read and write access to the repository.
    anon-access = read  # 无认证用户权限为读
    auth-access = write  # 认证用户权限为写
    ### The password-db option controls the location of the password
    ### database file.  Unless you specify a path starting with a /,
    ### the file's location is relative to the directory containing
    ### this configuration file.
    ### If SASL is enabled (see below), this file will NOT be used.
    ### Uncomment the line below to use the default password file.
    password-db = passwd  # 设置权限的密码路径文件
    
    • 添加访问用户username,密码设置为passwd,可自行调整
    $ sudo vi /usr/svn/repository/conf/passwd
    
    [users]
    # harry = harryssecret
    # sally = sallyssecret
    username = passwd
    
    • 设置用户权限,设置用户username为admin权限组,权限组权限为读写权限,所有组权限均有可读权限
    $ sudo vi /usr/svn/repository/conf/authz
    
    # [repository:/baz/fuz]
    # @harry_and_sally = rw
    # * = r
    admin = username
    @admin = rw
    * = r
    
    • 启动服务器并测试
    $ svnserve -d -r /usr/svn/
    # -d:表示在后台运行
    # -r:指定服务器的根目录 
    
    $ ps aux | grep -v grep | grep svnserve
    mars     23357  0.0  0.0  17072  2228 ?        Ss   5月27   0:00 svnserve -d -r /usr/svn/
    # 启动成功
    
    • 至此已可使用SVN管理工具对地址svn://x.x.x.x/repository进行检出(checkout),并进行文件的上传、下载。
    • END
    展开全文
  • 二是VPS不装FTP软件,使用FLASHFXP的SFTP功能上传管理文件的教程。LNMP是VPS建站的首选。本文所使用的VPS为美国BurstNET公司VPS,其基本配制:CPU:1G,内存:512M,硬盘:20G,流量:1000G/月,两 个...
  • //Remote server's ip address or hostname $sftp = new SFTP('192.168.0.1'); if (!$sftp->login('username', $key)) { exit('Login Failed'); } 受密码保护的RSA密钥 (Password Protected RSA Key) If your RSA ...
  • 上传文件到sftp远程服务器 内容精选换一换方法一:在VSCode上选择“文件 > 首选项 > 设置”,再选择“工作区”,并在输入框搜索“kunpeng.remote.ssh.machineinfo”,单击“在settings.json中编辑”后生成...
  • SFTP 文件配置

    2019-03-09 08:51:00
    sftp_config_file SFTP配置文件(Sublime Text 3 、VS Code) VS Code 的版本 { "host": "120.01.01.111", "port": 22, "username": "root", "password": "123456", "protocol": "sftp", ...
  • ftp和sftp文件服务器的区别 内容精选换一换Loader是在开源Sqoop组件的基础上进行了一些扩展,除了包含Sqoop开源组件本身已有的功能外,还开发了如下的增强特性:提供数据转化功能支持图形化配置转换步骤支持从SFTP/...
  • 类似于Dropbox的文件管理器,可让您在任何位置管理数据:FTP•FTPS•SFTP•WebDAV•Git•S3•LDAP•Mysql CardDAV•CalDAV•Backblaze B2•Minio Dropbox•Google云端硬盘具有类似于Dropbox的文件管理器,可让您在...
  • 最近用到SFTP上传文件查找了一些资料后自己做了一点总结,方便以后的查询/*** 将文件上传到服务器** @param filePath* 文件路径* @param channelSftp* channelSftp对象* @return*/public static boolean uploadFile...
  • 问题有一天我要连接到我的 web 服务器。我使用FileZilla连接到 FTP 服务器。当我输入主机名和密码连接服务器后,我得到了下面的错误。Error: Cannot establish FTP connection to an SFTP server. Please select ...
  • Linux SFTP详解

    千次阅读 2014-07-10 10:39:41
    在同一机房中只要有一台服务器...但如果服务器上已经开了SSH服务,我们完全可以使用SFTP来传输数据,何必要多开一个进程和端口呢? 下面,我就从账户设置、SSH设置、权限设置这三个方面来讲讲如何使用SFTP完全替代FT
  • Sftp和ftp over ssh2的区别 最近使用SecureFx,涉及了两个不同的安全文件传输协议: -sftp -ftp over SSH2 这两种协议是不同的。sftp是ssh内含的协议,只要sshd服务器启动了,它就可用,它本身不需要ftp服务器...
  • ftp sftp 学习记录

    千次阅读 2017-06-24 19:16:26
    [+] ...Sftp和ftp over ssh2的区别 ...sftp是ssh内含的协议,只要sshd服务器启动了,它就可用,它本身不需要ftp服务器启动。ftp over SSH2则象一个二传手。   1、SFTP的工作模式: 图1显示了SFT
  • 原文地址: ...在同一机房中只要有一台...但如果服务器上已经开了SSH服务,我们完全可以使用SFTP来传输数据,何必要多开一个进程和端口呢? 下面,我就从账户设置、SSH设置、权限设置这三个方面来讲讲如何使用SFTP完全替
  • tomcat有提供web页面管理应用的功能。 我们来看看怎么配置实现该功能。 进入tomcat默认页面时有“server status”、“manager app”、“Host manager”三个选项如图: 默认情况下,点击会跳转到401 Unauthorized报....
  • 一、启动SFtp 二、上手vs code SFTP插件 2.1 初始配置 2.2解决乱码问题 三、SFTP配置 3.1常用配置 3.2示例配置 四、SFTP使用 五、扩展阅读 一、启动SFtp 话说小编最近爱上了vs code开发工具,一是方便敏捷,...
  • sftp ftps的区别When you are in the process of setting up remote file transfer capabilities for your employees, you want things to be as simple and secure as possible. With that in mind, which is ...
  • Centos7中sftp服务配置

    2020-01-14 15:51:49
    Centos7中sftp服务配置 创建sftp用户 1)创建sftp权限组 groupadd sftp 2)创建sftp对应用户 useradd -g sftp -s /sbin/nologin -M sftpuser1 useradd -g sftp -s /sbin/nologin -M sftpuser2 3)设置sftp...
  • Media Manager Media Manager是一个开放源代码的Web文件管理器,可以很好地替代Wordpress Media Manager,CKFinder,KCFinder,elFinder...。它仍处于早期阶段,但是可以随时使用它,并报告Media Manager的错误。 ...
  • 首先大家可以先了解一下SFTP和FTP协议的区别,这里我就不熬诉了。 Sftp 默认监听端口22 Ftp协议默认监听端口21 本质没什么区别都是基于文件传输协议。前者安全性能高,后者效率高。 下面进入正题: 一,确保你的...
  • SFTP的账户直接使用Linux操作...首先建立3个要管理的目录: 1 2 3 mkdir /home/sftp/homepage mkdir /home/sftp/blog mkdir /home/sftp/pay 创建sftp组和www、blog、pay...
  • 最近有同事操作远程主机网络慢,sftp老连接不上,但是网页可以连上,给他鼓捣个在线管理的通道 monstaftp 简单的几个php文件,部署在服务器上就可以操作服务器文件 支持ftpsftp文件操作 太神奇了。 登陆界面 ...
  • web 资源管理器相关产品

    千次阅读 2012-03-07 21:39:53
    今天突发奇想,用web来操作资源管理器是一件多么美妙的事情,于是就在网上找了一下,发现还真有。 下面就来介绍一下,采用的技术全部是ajax+php,好像没有java的份,不知道是不是java不太擅长,管理的系统没有发现...
  • 类似于Dropbox的文件管理器,可让您在任何位置管理数据: •FTPS• •WebDAV•Git• • •Mysql CardDAV•CalDAV•Backblaze B2• Dropbox•Google云端硬盘 产品特点 通过浏览器管理文件 完全组织模式客户端() ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,691
精华内容 3,076
关键字:

sftpweb管理