搭建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)
}