Ubunut server14.04LTS安装ProFTP1.3.6、MySQL5.7.11
我的系统是Ubuntu server14.04LTS,在安装时只选择了OpenSSL。 我安装的ProFTP是源码安装的,在编译时需要用的MySQL的安装路径,系统自带的MySQL不是很好用,所以我就决定MySQL也用源码安装。
刚装好的系统建议分别使用 apt-get update
和apt-get upgrade
两条命令,把在线安装的源和系统内部源更新一下,否则在在线安装时会提示下载对应的包失败。
一、MySQL5.7.11安装
MySQL5.7.11安装包链接:http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.11-linux-glibc2.5-x86_64.tar.gz
1、卸载以前安装的MySQL或者是系统自带的
我的系统中带的是MySQL5的版本,执行下面4条语句卸载MySQL
sudo apt-get autoremove --purge mysql-server-5.0
sudo apt-get remove mysql-server
sudo apt-get autoremove mysql-server
sudo apt-get remove mysql-common
清除卸载残留
dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P
3、解压(已经使用shell工具将压缩包放在用户目录下)
cd /usr/local
tar zxvf /home/ubuntu/mysql-5.7.11-linux-glibc2.5-x86_64.tar.gz
mv mysql-5.7.11-linux-glibc2.5-x86_64 mysql
4、创建MySQL用户和组
添加用户组
groupadd mysql
添加mysql用户
useradd -r -g mysql -s /bin/false mysql
进入到解压的目录下面
cd mysql
创建此文件夹
mkdir mysql-files
改文件夹的权限
chmod 750 mysql-files
. 此时代表的文件夹是/usr/local/mysql,改当前文件夹及子目录的所有者
chown -R mysql .
. 此时代表的文件夹是/usr/local/mysql,改当前文件夹及子目录的用户组
chgrp -R mysql .
执行完后,它会给你一个root的初始密码,由大写字母、小写字母、数字、符号组成,保留下来为以后登录做准备,登录后可以修改。如果在登录时输入不正确,后面有方法可以补救。还会自动生成一个data文件夹,可以执行ls命令查看是否生成。
bin/mysqld --initialize --user=mysql
开启SSL
bin/mysql_ssl_rsa_setup
把当前目录的属主改回root
chown -R root .
修改data、mysql-files文件夹的属主
chown -R mysql data mysql-files
服务加到启动项的
cp support-files/mysql.server /etc/init.d/mysql.server
5、配置配置文件
修改mysql/support-files/my-default.conf
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
将修改后的文件拷贝至/etc下面,且重命名为my.cnf
cp support-files/my-default.cnf /etc/my.cnf
在/etc/profile文档最后配置MySQL环境变量
export MYSQL_HOME=/usr/local/mysql
export PATH=$PATH:$MYSQL_HOME/bin
使配置文件生效
source /etc/profile
6、启动MySQL
(1)将启动脚本拷贝到/etc/init.d路径下
cp support-files/mysql.server /etc/init.d/mysql
使用下面命令开启、重启、关闭MySQL
/etc/init.d/mysql start (restart|stop)
(2)在MySQL安装路径中
support-files/mysql.server start (restart|stop)
(3)开机自启动
在/etc/rc.local文档中添加代码:
sudo /etc/init.d/mysql start
或:sudo /usr/local/mysql/support-files/mysql.server start
你执行任何命令,MySQL都会提示你以下信息:
ERROR 1820 (HY000): You must SET PASSWORD before executing this statement
这是因为上面生成的密码是临时的,刚进去MySQL需要先设置root的密码才能进行其他的操作。 解决方法:
SET PASSWORD = PASSWORD('123456');
7、忘记root临时密码
之前在安装的时候不是有一步会给个初始密码你么,这在以前的mysql的时候是没有初始密码的,直接回车就到数据库里面去了。
执行bin/mysql -uroot -p
,系统提示:ERROR 1045 (28000) : Access denied for user 'root'@'localhost' (using password : No)
修改MySQL的配置文件(默认为/etc/my.cnf),在[mysqld]下添加一行:skip-grant-tables
service mysqld restart
后,即可直接使用 mysql
进入。
CentOS设置root密码:
mysql> update mysql.user set authentication_string=password('123456') where user='root' and Host = 'localhost';
Ubuntu设置root密码:
mysql> update user set password=PASSWORD('123456') where user='root';
刷新权限
mysql> flush privileges;
mysql> quit;
将/etc/my.cnf文件还原(删除skip-grant-tables),重新启动
support-files/mysql.server restart,这个时候可以使用mysql -u root –p '123456'进入了
安装过程中遇到的错误及解决办法
1、当我执行mysql –uroot –p时提示我如下信息:
The program 'mysql' can be found in the following packages:
*mysql-client-core-5.5
*mariadb-client-core-5.4
*mysql-client-core-5.6
*percona-xtradb-cluster-client-5.5
Try: agt-get install <selected package>
可以执行下面代码:
bin/mysql –uroot –p
尝试过把bin下面的mysql脚本拷贝至mysql路径中,但还是提示如上信息
但是这样有点不太方便的就是每次进入MySQL都需要切换到MySQL的安装路径下,在这里再介绍个更方便的方法,就是使用别名,这样可以在任何文件夹下面都可以开启MySQL。
vim ~/.bashrc
alias mysql='/usr/local/mysql/bin/mysql'
source ~/.bashrc
二、ProFTP1.3.6安装
ProFTP安装包链接:ftp://ftp.proftpd.org/distrib/source/proftpd-1.3.6rc2.tar.gz
预期效果:当在MySQL数据库中插入一个用户时,ubuntu系统也要创建该用户。/home目录下的用户文件夹就作为该用户的FTP空间。
因为系统最初什么都没有安装,所以在编译安装ProFTP前把gcc、make工具装上。
apt-get install gcc
apt-get install make
ProFTPd依赖的库
apt-get install zlib1g-dev
1、 创建用户、用户组
a、创建proftpd服务运行的用户和用户组(数字为uid、gid,可以随意设置,但是要大于500)
groupadd ftpgroup -g 3001
useradd ftpuser -u 3001 -g 3001 -s /usr/sbin/nologin
chown –R ftpuser.ftpgroup /home
b、创建匿名登陆用户映射的系统用户和用户组
groupadd ftp -g 3000
创建匿名用户访问空间
mkdir /home/ftp
useradd ftp -u 3000 -g 3000 -d /home/ftp -s /usr/sbin/nologin
chown –R ftp.ftp /home/ftp
chmod 755 /home/ftp
2、 编译安装
a、 安装配置
./configure --prefix=/usr/local/proftpd --with-modules=mod_sql:mod_sql_mysql:mod_quotatab:mod_quotatab_sql --with-includes=/usr/local/mysql/include/ --with-libraries=/usr/local/mysql/lib/
解释:
--prefix Proft的安装路径
--with-includes mysql 的includes 目录
--with-libraries mysql 的lib 目录
--with-modules 添加 mod_sql、mod_sql_mysql 模块是为了让 ProFTP 支持通过 MySQL 数据库中的数据验证用户,添加 mod_quotatab、 mod_quotatab_sql 是为了让 ProFTP 支持磁盘限额和从MySQL数据库中读取、写入磁盘限额信息
b、编译安装
make
make install
3、 修改ProFTP配置文件
ProFTP的配置文件为proftpd安装路径下的etc下的proftpd.conf 以下是我的配置文件:
ServerName "My_Ftp_Server"
ServerType standalone
DeferWelcome off
DefaultServer on
ShowSymlinks on
UseReverseDNS off
AllowStoreRestart on
AllowRetrieveRestart on
UseIPv6 off
DefaultRoot ~
RequireValidShell off
Port 21
MaxInstances 30
User ftpuser
Group ftpgroup
<Directory />
AllowOverWrite on
</Directory>
Umask 022
AllowOverwrite on
TransferLog /var/log/proftpd/xferlog
SystemLog /var/log/proftpd/proftpd.log
<IfModule mod_quotatab.c>
QuotaEngine on
QuotaLog /var/log/proftpd/quota.log
<IfModule mod_quotatab_sql.c>
SQLNamedQuery get-quota-limit SELECT "* FROM quotalimits WHERE
name = '%{0}' AND quota_type = '%{1}'"
SQLNamedQuery get-quota-tally SELECT "* FROM quotatallies WHERE name = '%{0}' AND quota_type = '%{1}'"
SQLNamedQuery update-quota-tally UPDATE "bytes_in_used = bytes_in_used + %{0}, bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, files_xfer_used = files_xfer_used + %{5} WHERE name = '%{6}' AND quota_type = '%{7}'" quotatallies
SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" quotatallies
QuotaLock /var/lock/ftpd.quotatab.lock
QuotaLimitTable sql:/get-quota-limit
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally
</IfModule>
</IfModule>
<Limit SITE_QUOTA>
AllowAll
</Limit>
<Anonymous ~ftp>
User ftp
Group ftp
UserAlias anonymous ftp
RequireValidShell off
MaxClients 30
<Limit WRITE>
DenyAll
</Limit>
</Anonymous>
QuotaDirectoryTally on
QuotaDisplayUnits "Mb"
QuotaEngine on
QuotaLog /usr/local/proftpd/var/quotaLog
QuotaShowQuotas on
SQLLogFile "/var/log/proftpd/proftpd.sql.log
SQLConnectInfo proftpd@localhost:3306 ftp 123
SQLAuthTypes Backend Plaintext
SQLUserInfo ftpusers userid passwd uid gid homedir shell
SQLGroupInfo ftpgroups groupname gid members
SQLAuthenticate users groups usersetfast groupsetfast
具体的参数介绍可以参考以下文档:http://os.51cto.com/art/201103/247083.htm 扩展内容
limit用法如下:
CMD:Change Working Directory 改变目录
MKD:MaKe Directory 建立目录的权限
RNFR: ReName FRom 更改目录名的权限
DELE:DELEte 删除文件的权限
RMD:ReMove Directory 删除目录的权限
RETR:RETRieve 从服务端下载到客户端的权限
STOR:STORe 从客户端上传到服务端的权限
READ:可读的权限,不包括列目录的权限,相当于RETR,STAT等
WRITE:写文件或者目录的权限,包括MKD和RMD
DIRS:是否允许列目录,相当于LIST,NLST等权限,还是比较实用的
ALL:所有权限
LOGIN:是否允许登陆的权限 针对上面这个Limit所应用的对象,又包括以下范围
AllowUser 针对某个用户允许的Limit
DenyUser 针对某个用户禁止的Limit
AllowGroup 针对某个用户组允许的Limit
DenyGroup 针对某个用户组禁止的Limit
AllowAll 针对所有用户组允许的Limit
DenyAll 针对所有用户禁止的Limit
三、添加用户,设置磁盘限额
1、 创建数据库
create database proftpd;
切换数据库
use proftpd;
添加连接数据库的用户,与配置文件proftpd.conf中SQLConnectInfo信息一致
grant all privileges on proftpd.* to ftp@"localhost" identified by "123";
2、 创建用户、磁盘限额表
a、 创建用户表
CREATE TABLE ftpusers (userid TEXT NOT NULL,passwd TEXT NOT NULL,uid INT NOT NULL,gid SMALLINT NOT NULL,homedir TEXT,shell TEXT);
b、 创建用户组表
CREATE TABLE ftpgroups (groupname TEXT NOT NULL,gid SMALLINT NOT NULL,members TEXT NOT NULL);
c、创建磁盘限额信息表
CREATE TABLE quotalimits (
name VARCHAR(30),
quota_type ENUM("user", "group","class", "all") NOT NULL,
per_session ENUM("false", "true")NOT NULL,
limit_type ENUM("soft", "hard")NOT NULL,
bytes_in_avail FLOAT NOT NULL,
bytes_out_avail FLOAT NOT NULL,
bytes_xfer_avail FLOAT NOT NULL,
files_in_avail INT UNSIGNED NOT NULL,
files_out_avail INT UNSIGNED NOT NULL,
files_xfer_avail INT UNSIGNED NOT NULL
);
扩展内容
quotalimits 表中各字段的含意:
quota_type 磁盘限额的鉴别
bytes_in_avail 上传最大字节数,就是FTP用户空间容量
bytes_out_avail 下载最大字节数
bytes_xfer_avail 总共可传输的文件的最大字节数(上传和下载流量)
files_in_avail 总共能上传文件的数目
files_out_avail 能从服务器上下载文件的总数目
files_xfer_avail 总共可传输文件的数目(上传和下载)
d、 创建磁盘使用信息表
CREATE TABLE quotatallies (
name VARCHAR(30) NOT NULL,
quota_type ENUM("user", "group", "class", "all") NOT NULL,
bytes_in_used FLOAT NOT NULL,
bytes_out_used FLOAT NOT NULL,
bytes_xfer_used FLOAT NOT NULL,
files_in_used INT UNSIGNED NOT NULL,
files_out_used INT UNSIGNED NOT NULL,
files_xfer_used INT UNSIGNED NOT NULL
);
该表中的内容系统会自动添加
3、 添加FTP用户记录
a、 添加普通用户
添加用户proftp,密码为123456,/home/proftp是用户主目录,proftp用户将在该用户访问服务器时自动创建,用户shell为空
INSERT INTO ftpusers (userid, passwd, uid, gid,homedir, shell)
values ('proftp', '123456', 3002, 3001, '/home/proftp','' );
添加用户组
INSERT INTO ftpgroups VALUES ('ftpgroup', 3001, 'proftp');
添加磁盘限额信息
建立初始用户磁盘限额信息,为用户proftp,最多可以上传51200000字节,即分配了大约48.83MB的空间。最多可以下载48.83MB,最多可以上传1000个文件,下载1000个文件,文件的传输流量为48.83MB,总共可以传输2000个文件。(如果不想对这些作限制,可以设置为0)
INSERT INTO quotalimits (name,quota_type,per_session,limit_type,bytes_in_avail,
bytes_out_avail,bytes_xfer_avail,files_in_avail,files_out_avail,files_xfer_avail)
VALUES ('http', 'user', 'false', 'hard', '51200000','51200000','51200000','1000', '1000','2000');
在ubuntu系统中添加用户、设置密码
useradd proftp -u 3002 -g 3001 -d /home/proftp -s /usr/sbin/nologin -m
passwd proftp
为了便于管理用户,建议以后创建系统用户时UID依次递增(下一个用户可以使用3003)。
b、 添加匿名用户
匿名用户只用添加用户组
INSERT INTO ftpgroups VALUES ('ftp', 3000, 'ftp');
4、 设置ProFTP环境变量
vim /etc/profile
export PROFTPD_HOME=/usr/local/proftpd
export PATH=$PATH:$PROFTPD_HOME/bin
source /etc/profile
如果已经声明过来PATH,可以直接在PATH后面追加:$PROFTPD_HOME/bin
5、 运行ProFTP
因为配置文件中有好多日志文件的输出路径,我们需要自己创建几个文件
mkdir /var/log/proftpd
touch /var/log/proftpd/proftpd.log
proftpd的启动需要用到MySQL的一个库(libmysqlclient.so.20),我们提前把它添加进来。
vim /etc/ld.so.conf
/usr/local/mysql/lib
使配置文件生效
ldconfig
在proftpd安装路径下执行:
./proftpd
6、 验证性测试
a、 拷贝一些文件放在/home/ftp文件夹中,在浏览器地址栏中输入ftp://192.168.3.99(这个是FTP服务器的IP地址),会看到你拷贝的文件。
b、 在windows中打开cmd,输入ftp 192.168.3.99
,回车后会提示输入用户名、密码,使用quote site quota
命令,有磁盘限额信息显示。往文件夹里面拷贝文档,重新执行quote site quota
,磁盘限额信息发生变化
7、添加启动脚本
vim /etc/init.d/proftpd
脚本内容:
#!/bin/bash
#
FTPD_BIN=/usr/local/proftpd/sbin/proftpd
FTPD_CONF=/usr/local/proftpd/etc/proftpd.conf
PIDFILE=/usr/local/proftpd/var/proftpd.pid
if [ -f $PIDFILE ]; then
pid=
cat $PIDFILE
fi
if [ ! -x $FTPD_BIN ]; then
echo "$0: $FTPD_BIN: cannot execute"
exit 1
fi
case $1 in
start)
if [ -n "$pid" ]; then
echo "$0: proftpd [PID $pid] already running"
exit
fi
if [ -r $FTPD_CONF ]; then
echo "Starting proftpd..."
$FTPD_BIN -c $FTPD_CONF
else
echo "$0: cannot start proftpd -- $FTPD_CONF missing"
fi
;;
stop)
if [ -n "$pid" ]; then
echo "Stopping proftpd..."
kill -TERM $pid
else
echo "$0: proftpd not running"
exit 1
fi
;;
restart)
if [ -n "$pid" ]; then
echo "Rehashing proftpd configuration"
kill -HUP $pid
else
echo "$0: proftpd not running"
exit 1
fi
;;
*)
echo "usage: $0 {start|stop|restart}"
exit 1
;;
esac
exit 0
给脚本设置可执行权限
chmod +x /etc/init.d/proftpd
以后就可以通过下面命令控制proftpd的开启与关闭
/etc/init.d/proftpd start(stop|restart)