搭建ftp服务器

install

centos7

yum -y install vsftpd

ubuntu

apt-get install -y vsftpd

 

查看是否安装成功

service vsftpd status

禁用匿名登录

centos环境,配置文件位置在/etc/vsftpd/vsftpd.conf

vim /etc/vsftpd/vsftpd.conf

修改anonymous_enable=YES为 anonymous_enable=NO

重启ftp

systemctl restart vsftpd

ubuntu环境,配置文件位置在/etc/vsftpd.conf 。默认禁用了匿名登录

通过查看ftpusers 和 user_list是登录的黑名单和白名单

但是直接使用root竟然无法登陆成功,原因在于root恰好处于ftpusers列表,是黑名单无法登录,因此必须注释掉ftpusers和user_list里面的root才可以使用root用户登录。

添加用户密码

# 添加katy用户
useradd -m katy#会在/home下创建katy目录
# 给katy用户添加密码
# 密码规则:
  # The password is shorter than 8 characters;不能小于8个字符
  # The password contains the user name in some form。也不能包含用户名
passwd katy # 这里会有两次输入密码的操作,一次是新密码,还有一次是确认密码。


# 指向已存在的目录,用户名为buildpack,已存在的目录再添加user会给提示
[root@warehouse demo]# useradd -d  /var/lib/it/data/buildpack -s /bin/sh buildpack
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.

# 给buildpack设置密码
passwd buildpack
 
[如果目录不在/home下,那么需要给目录777权限:chmod 777 /var/lib/it/data/buildpack],否则报错:550-Create directory operation failed

centos环境给非/home目录下的文件夹设置了777权限后可以正常上传文件,但是ubuntu环境就不行,总是报错:550 Permission denied

ubuntu环境是因为配置文件里面默认不允许文件上传,于是修改/etc/vsftpd.conf,允许文件上传。

ubuntu环境默认不允许文件上传,取消掉write_enable=YES,前面的#即可,重启ftp。 

 

日志文件

cat /var/log/xferlog

文件上传

ftp的文件默认是在/home/katy下。即在创建的用户名下。如/home/katy

 

 

代码实现文件上传和下载

得到访问ftp的client

type ftpClient struct {
	*goftp.Client
}

func newClient(serverAddr, user, password string) (*ftpClient, error) {
	ftp, err := goftp.DialConfig(goftp.Config{
		User:               user,
		Password:           password,
		ConnectionsPerHost: 10,
		Timeout:            time.Second * 30,
	}, serverAddr)
	if err != nil {
		return nil, errors.New("Fail to conn to ftp server " + serverAddr + " due to " + err.Error())
	}
	return &ftpClient{Client: ftp}, nil
}

上传

func (client ftpClient) FtpUpload(ns, localFile string) (string, error) {
	// 1. 先判断local file是否存在
	file, err := os.Open(localFile)
	// Could not create file
	//file, err := os.OpenFile(localFile, syscall.O_CREAT|syscall.O_WRONLY|syscall.O_TRUNC, 0744)
	if err != nil {
		return "", err
	}
	defer file.Close()
	// 2.得到pwd
	pwd, pwdErr := client.Client.Getwd()
	if pwdErr != nil {
		return "", err
	}
	// 2. 创建savePath
	savePath := path.Join(pwd, ns)
	_, err = client.Client.Mkdir(savePath)
	if err != nil {
		// 由于搭建ftp的时候已经给了`pwd` 777的权限,这里忽略文件夹创建的错误
		if !strings.Contains(err.Error(), "550-Create directory operation failed") {
			return "", err
		}
	}
	// 上传完毕后关闭当前的ftp连接
	defer client.Client.Close()
	dstName := filepath.Base(file.Name())
	dstPath := path.Join(savePath, dstName)
	// 文件上传
	return dstPath, client.Client.Store(dstPath, file)
}

下载