centos7 配置 sftp 服务器并通过 java 上传文件

虚拟机配置

1、创建sftp用户组

groupadd sftp

2、添加用户

useradd -g sftp mysftp

3、设置用户密码

passwd mysftp

4、创建文件根目录

mkdir /app/data

5、将该目录设置到用户上

usermod -d /app/data mysftp

6、修改配置文件

 vim /etc/ssh/sshd_config

7、找到 Subsystem ,将之前的配置注释掉,增加新的配置

#注释掉下面一行,改用自定义的
#Subsystem      sftp    /usr/libexec/openssh/sftp-server

Subsystem sftp internal-sftp #这行指定使用sftp服务使用系统自带的internal-sftp
Match Group sftp #这行用来匹配用户组
ChrootDirectory /app/data  #用chroot将用户的根目录指定到/app/data ,这样用户就只能在/app/data 下活动
AllowTcpForwarding no
ForceCommand internal-sftp #指定sftp命令

8、创建属于该用户的访问目录并设置用户组

mkdir /app/data/upload
chown -R mysftp:sftp /app/data/upload/

mkdir /app/data/download
chown -R mysftp:sftp /app/data/download/

9、重启sshd服务

service sshd restart

10、通过任意的sftp连接工具测试连接

我这边使用的是 WinSCP

连接后能看到下图说明服务正常(无法跳转到 /app/data 以外的路径才对,保护资源)

centos7 配置 sftp 服务器并通过 java 上传文件_第1张图片

java 代码

1、测试代码

public static void main(String[] args) {
    JSch jSch = new JSch();
    Session session = null;
    Channel channel = null;
    OutputStream outputStream = null;
    InputStream inputStream = null;
    ChannelSftp channelSftp;

    String xml = "\n" +
            "\n" +
            "    我是一个测试文件\n" +
            "\n";
    try {
        session = jSch.getSession("mysftp", "192.168.141.100", 22);
        session.setPassword("xxxxxx");
        Properties properties = new Properties();
        properties.setProperty("StrictHostKeyChecking", "no");
        session.setConfig(properties);
        session.connect(30000);
        channel = session.openChannel("sftp");
        channel.connect(30000);
        channelSftp = (ChannelSftp) channel;
        channelSftp.cd("/upload");
        outputStream = channelSftp.put("test.xml");
        inputStream = new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8));
        byte[] b = new byte[1024];
        int n;
        while ((n = inputStream.read(b)) != -1) {
            outputStream.write(b, 0, n);
        }
        outputStream.flush();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (null != outputStream) {
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (null != inputStream) {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (null != session) {
            session.disconnect();
        }
        if (null != channel && channel.isConnected()) {
            channel.disconnect();
        }
    }
}

2、执行完成后,会在服务器中的 upload 文件夹内生成一个 xml 文件

centos7 配置 sftp 服务器并通过 java 上传文件_第2张图片

3、说明

在 java 程序中 cd 的路径不是服务器的绝对路径,而是以当前用户为起点的目录(channelSftp.cd("/upload");

这个路径可以在服务器中查看:

[root@root /]# sftp [email protected]
[email protected]'s password: 
Connected to 127.0.0.1.
sftp> pwd
Remote working directory: /
sftp> 

其他

在 linux 服务器中查看 22 端口的连接情况(连接个数,ip)

netstat -anp | grep :22 | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

这个命令的含义是:

netstat -anp:列出所有的网络连接

grep :22:筛选出SSH端口连接

grep ESTABLISHED:筛选出已经建立的连接

awk '{print $5}':提取出连接的IP地址和端口号

cut -d: -f1:只保留IP地址

sort:按IP地址排序

uniq -c:统计每个IP连接的个数

sort -n:按连接数排序,从少到多

你可能感兴趣的:(linux相关,java后端,java,centos)