文件系统 FTP Ubuntu 安装入门介绍

FTP

环境: Ubuntu 14.04

blog zh_CN
ubuntu14.04

  • Install

    全新安装:apt-get install vsftpd
    重新安装:apt-get --reinstall install vsftpd
    卸载并清除配置文件:apt-get --purge remove vsftpd

  • Start & Restart

    $ service vsftpd start
    $ service vsftpd restart

注意:

网上文章很多有提及/etc/init.d/vsftpd start 之类的启动方式。但是这个目录下我不存在 vsftpd. 这个目录确实有: /etc/init/vsftpd.conf

vsftpd 已經進化為 Upstart job
設定檔放在
/etc/init/vsftpd.conf
  • Create ftp user

1.此用户只是用来使用ftp服务的 2.此用户不可登录服务器 3.此用户不能访问ftp指定文件夹之外的文件

(1) 创建一个用户ftp0

useradd -d /home/ftp0 -m ftp0

(2) 修改ftp0的密码

passwd ftp0
  • Config /etc/vsftpd.conf

    anonymous_enable=NO # 不允许匿名访问
    write_enable=YES # 允许写
    local_enable=YES # 允许本地主机访问
    chroot_local_user=YES # 只能访问自身的目录,此处有坑,需加上下面一行

报错误信息:

"500 OOPS: vsftpd: refusing to run with writable root inside chroot()"

从2.3.5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报该错误。

(1) 启用了chroot的话,根目录要设置为不可写

chmod a-w /home/ftp0

(2) 或者添加一句话

allow_writeable_chroot=YES #允许写自身的目录

可是添加这句话可能会导致服务重启失败。。。

无奈之下。。。chroot_local_user=YES这句话暂时不加。

  • 让用户不能登录

    $ usermod -s /sbin/nologin ftp0

after all these, restart the ftp service:

# service vsftpd restart
vsftpd stop/waiting
vsftpd start/pre-start, process 10305
# service vsftpd status
vsftpd start/running, process 10305
  • Test

    ftp

    ftp> open 192.168.2.108
    Connected to 192.168.2.108.
    220 (vsFTPd 3.0.2)
    Name (192.168.2.108:hbb): ftp0
    331 Please specify the password.
    Password:
    530 Login incorrect.
    Login failed.

需要 vi /etc/shells, 最后一行添加:

/sbin/nologin

重新测试:

# ftp
ftp> open 192.168.2.108
Connected to 192.168.2.108.
220 (vsFTPd 3.0.2)
Name (192.168.2.108:hbb): ftp0
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.

21 端口查看:

netstat -npltu | grep 21
tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN      11398/vsftpd

Ftp Java code

  • Java 测试代码
java 复制代码
package com.ryo.ftp;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

import java.io.File;
import java.io.FileInputStream;

/**
 * @author houbinbin
 * @on 17/1/1
 */
public class FTPTest {

    private FTPClient ftp;

    /**
     * @param path     上传到ftp服务器哪个路径下
     * @param addr     地址
     * @param port     端口号
     * @param username 用户名
     * @param password 密码
     * @return
     * @throws Exception
     */
    private boolean connect(String path, String addr, int port, String username, String password) throws Exception {
        boolean result = false;
        ftp = new FTPClient();
        int reply;
        ftp.connect(addr, port);
        ftp.login(username, password);
        ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
        reply = ftp.getReplyCode();
        if (!FTPReply.isPositiveCompletion(reply)) {
            ftp.disconnect();
            return result;
        }
        ftp.changeWorkingDirectory(path);
        result = true;
        return result;
    }

    /**
     * @param file 上传的文件或文件夹
     * @throws Exception
     */
    private void upload(File file) throws Exception {
        if (file.isDirectory()) {
            ftp.makeDirectory(file.getName());
            ftp.changeWorkingDirectory(file.getName());
            String[] files = file.list();
            for (int i = 0; i < files.length; i++) {
                File file1 = new File(file.getPath() + "\\" + files[i]);
                if (file1.isDirectory()) {
                    upload(file1);
                    ftp.changeToParentDirectory();
                } else {
                    File file2 = new File(file.getPath() + "\\" + files[i]);
                    FileInputStream input = new FileInputStream(file2);
                    ftp.storeFile(file2.getName(), input);
                    input.close();
                }
            }
        } else {
            File file2 = new File(file.getPath());
            FileInputStream input = new FileInputStream(file2);
            ftp.storeFile(file2.getName(), input);
            input.close();
        }
    }

    //测试即使指定其他用户的文件夹,还要没有写的权限也无法上传。
    public static void main(String[] args) throws Exception {
        FTPTest t = new FTPTest();
        t.connect("/home/ftp0/", "192.168.2.108", 21, "ftp0", "123456");
        File file = new File("/Users/houbinbin/Downloads/ftptest.txt");
        t.upload(file);
    }

}
相关推荐
V+zmm1013411 分钟前
基于微信小程序的乡村政务服务系统springboot+论文源码调试讲解
java·微信小程序·小程序·毕业设计·ssm
Oneforlove_twoforjob37 分钟前
【Java基础面试题025】什么是Java的Integer缓存池?
java·开发语言·缓存
xmh-sxh-131439 分钟前
常用的缓存技术都有哪些
java
AiFlutter1 小时前
Flutter-底部分享弹窗(showModalBottomSheet)
java·前端·flutter
J不A秃V头A2 小时前
IntelliJ IDEA中设置激活的profile
java·intellij-idea
DARLING Zero two♡2 小时前
【优选算法】Pointer-Slice:双指针的算法切片(下)
java·数据结构·c++·算法·leetcode
小池先生2 小时前
springboot启动不了 因一个spring-boot-starter-web底下的tomcat-embed-core依赖丢失
java·spring boot·后端
CodeClimb2 小时前
【华为OD-E卷-木板 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
程序员厉飞雨2 小时前
Android R8 耗时优化
android·java·前端
odng2 小时前
IDEA自己常用的几个快捷方式(自己的习惯)
java·ide·intellij-idea