博客详情

Centos7搭建sftp服务 (原创)

作者: 朝如青丝暮成雪
发布时间:2022-10-11 20:25:42  文章分类:java编程   阅读(1883)  评论(0)

Centos7搭建SFTP服务

参考文章: https://blog.csdn.net/weixin_45688268/article/details/126355365


yum install -y openssl openssh-server #更新ssh包


#新建用户组sftp
groupadd sftp

useradd -g sftp -d /data/sftp/sftpuser -M -s /sbin/nologin  sftpuser

#设置sftpuser用户的密码
passwd sftpuser
[输入密码:如 12345678]


# 由于/data/sftp/sftpuser的用户是root,其它用户都没有写的权限
# 所以要在该目录下新建一个目录用于文件的上传下载
mkdir -p /data/sftp/sftpuser/files
chown sftpuser:sftp /data/sftp/sftpuser/files
chmod -R 755 /data/sftp/sftpuser/


cp -rf /etc/ssh/sshd_config /etc/ssh/sshd_config.bak 

vi /etc/ssh/sshd_config ,新增(修改)内容如下

PermitRootLogin yes
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys


在最后新增内容如下:
# 注释 Subsystem       sftp    /usr/libexec/openssh/sftp-server
Subsystem sftp internal-sftp
Match Group sftp
ChrootDirectory /data/sftp/%u
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
ClientAliveInterval 60

#重启sshd服务
systemctl restart sshd 

#客户端连接
sftp -P 22 sftpuser@127.0.0.1 
[输入密码:12345678] 登录


SFTPUtil.java


import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import lombok.extern.slf4j.Slf4j;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

/**
 * SFTP操作工具类
 */
@Slf4j
public class SFTPUtil {

    private String loginName  ;
    private String loginPassword ;
    private String server ;
    private Integer port ;


    public SFTPUtil(String loginName, String loginPassword, String server, Integer port){
          this.loginName=loginName;
          this.loginPassword=loginPassword;
          this.server=server;
          this.port=port;
    }

    /**
     * 连接登陆远程服务器
     * @return
     */
    public ChannelSftp connect()  {
        JSch jSch = new JSch();
        Session session = null;
        ChannelSftp sftp = null;
        try {
            session = jSch.getSession(loginName, server, port);
            session.setPassword(loginPassword);
            session.setConfig(getSshConfig());
            session.connect();

            sftp = (ChannelSftp)session.openChannel("sftp");
            sftp.connect();
            log.info("连接SFTP服务器成功!");
        } catch (Exception e) {
            log.error("SSH方式连接SFTP服务器失败!",e);
            return null;
        }
        return sftp;
    }

    /**
     * 获取服务配置
     * @return
     */
    private Properties getSshConfig() {
        Properties sshConfig =  new Properties();
        sshConfig.put("StrictHostKeyChecking", "no");
        return sshConfig;
    }


    /**
     * 关闭连接
     * @param sftp
     */
    public void disconnect(ChannelSftp sftp) {
        try {
            if(sftp!=null){
                if(sftp.getSession().isConnected()){
                    sftp.getSession().disconnect();
                }
            }
        } catch (Exception e) {
            log.error("关闭与sftp服务器会话连接异常",e);
        }
    }

    /**
     * 写内容到远端文件 (写文本内容)
     * @param content  文件文本内容
     * @param remoteFileName
     */
    public void writeRemoteFile(String content,String remoteFileName){
        ChannelSftp sftp = null;
        try {
            sftp = connect();
            ByteArrayInputStream input =new ByteArrayInputStream(content.getBytes());
            sftp.put(input, remoteFileName);

        }catch (Exception e){
            log.error(e.getMessage(),e);
        }finally {
            try {
                // 关闭连接
                disconnect(sftp);
            } catch (Exception e) {
                log.error("关闭连接出错!",e);
            }
        }
    }

    /**
     * 写文件流到远端文件
     * @param in
     * @param remoteFileName
     */
    public  void writeRemoteFile(InputStream in,String remoteFileName){
        ChannelSftp sftp = null;
        try {
            sftp = connect();
            sftp.put(in, remoteFileName);
        }catch (Exception e){
            log.error(e.getMessage(),e);
        }finally {
            disconnect(sftp);
        }
    }


    /**
     * 读取远端文件的内容  (文本读取)
     * @param remoteFileName
     * @return
     */
    public List readRemoteFileLines(String remoteFileName){
        ChannelSftp sftp = null;
        InputStream in ;
        try {
            sftp = connect();
            in = sftp.get(remoteFileName);
            if(in==null){
                log.error("获取远端文件不存在");
                return null;
            }
            List list=new ArrayList<>();
            BufferedReader br =new BufferedReader(new InputStreamReader(in,"utf-8"));
            String line;
            while ((line=br.readLine())!=null){
                list.add(line);
            }
            return list;
        }catch (Exception e){
            log.error(e.getMessage(),e);
            return null;
        }finally {
            try {
                // 关闭连接
                disconnect(sftp);
            } catch (Exception e) {
                log.error("关闭连接出错!",e);
            }
        }
    }

    /**
     * 读取远端文件流
     * @param remoteFileName
     * @return
     */
    public InputStream readRemoteFileAsStream(String remoteFileName){
        ChannelSftp sftp = null;
        try {
            InputStream in =sftp.get(remoteFileName);
            if(in==null){
                log.error("获取远端文件不存在");
                return null;
            }
            return in ;
        }catch (Exception e){
            log.error(e.getMessage(),e);
            return null ;
        }finally {
            disconnect(sftp);
        }
    }


}






关键字:  SFTP
评论信息
暂无评论
发表评论

亲,您还没有登陆,暂不能评论哦! 去 登陆 | 注册

博主信息
   
数据加载中,请稍候...
文章分类
   
数据加载中,请稍候...
阅读排行
 
数据加载中,请稍候...
评论排行
 
数据加载中,请稍候...

Copyright © 叮叮声的奶酪 版权所有
备案号:鄂ICP备17018671号-1

鄂公网安备 42011102000739号