平台:Redhat/CentOS
目录
一、软件安装
1、检查是否安装了 ftp
服务软件 vsftpd
:
$ rpm -qa | grep vsftpd
vsftpd-3.0.2-29.el7_9.x86_64
如果有安装则打印软件版本信息,没有安装则没有任何提示信息。
2、安装 vsftpd
:ftp 服务器的守护进程
$ yum install -y vsftpd
3、安装 ftp
客户端:用于连接登陆 ftp
服务器
$ yum install -y ftp
二、运行 ftp 服务程序
1、启动 vsftpd
$ systemctl start vsftpd
查看服务程序:
$ ps -ef | grep vsftpd
root 9583 1 0 12:14 ? 00:00:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
root 9724 9390 0 14:05 pts/0 00:00:00 grep --color=auto vsftpd
2、关闭 vsftpd
$ systemctl stop vsftpd
3、重启 vsftpd
$ systemctl restart vsftpd
三、配置 ftp 服务程序
1、编辑 vsftpd
的核心配置文件配置文件:/etc/vsftpd/vsftpd.conf
# 允许匿名用户登陆
anonymous_enable=YES
# 允许匿名用户上传文件
anon_upload_enable=YES
# 允许匿名用户创建目录
anon_mkdir_write_enable=YES
2、配置 ftp
登录用户
在 /etc/vsftpd/
目录下包含两个用户列表文件:
user_list
:用户白名单,如果vsfptd.conf
设置userlist_deny=NO
,在只允许这个文件下的用户登录 ftp;如果userlist_deny=YES
则这个文件的用户永远不会被允许登录,甚至连密码提示都没有。ftpusers
:用户黑名单,这个文件中出现的用户不会被允许登录。
所以我们修改配置如下:
# 启用用户白名单
userlist_enable=YES
userlist_deny=no
# 设置userlist文件位置
userlist_file=/etc/vsftpd/user_list
然后编辑 /etc/vsftpd/user_list
文件,在里面添加或移除允许登录登录 ftp 的用户,然后重启 vsftpd 程序。
问题①:如果使用用户密码登录 ftp 的时候报错:
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
则可以在 vsftpd.conf
中添加如下配置:
allow_writeable_chroot=YES
问题②:输入 ftp 命令后断开连接;
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
原因是ftp在主动模式下是通过21端口进行登陆的,但是后续是通过20端口与客户端进行数据交换。
解决办法为:
- 在server端的防火墙中开放ftp服务
$ firewall-cmd --add-service=ftp --permanent
$ firewall-cmd --reload
并且每次重启 vsftpd 后都要重新开放一次,如果还不行的话,ftp 客户端那边的防火墙也要开放 ftp 服务。
- 设置
selinux
权限
$ setsebool -P allow_ftpd_full_access on
3、修改共享目录
# 修改普通用户的共享根目录
local_root=/tmp/pub
chroot_local_user=YES
# 修改匿名用户的共享根目录
anon_root=/tmp/anon/pub
修改完后重启 vsftpd
服务程序。
四、登录并上传文件
1、登录命令为:ftp + 服务器IP
$ ftp 192.168.56.10
Connected to 192.168.56.10 (192.168.56.10).
220 (vsFTPd 3.0.2)
Name (192.168.56.10:root): anonymous # 使用匿名用户登录
331 Please specify the password.
Password: # 匿名用户不用输入密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
注意:
- 出现提示输入用户时,输入
anonymous
为匿名登陆 - 出现提示密码输入时,如果是匿名用户直接按回车
- 退出ftp,输入
quit
2、上传文件到 ftp 服务器
①、正常上传流程
登录 ftp 时,默认进入 ftp 的共享根目录 /var/ftp/
:
ftp> pwd
257 "/"
ftp> ls
drwxr-xr-x 2 0 0 6 Jun 09 16:15 pub
切换到要上传到服务的文件所在的本地路径:
ftp> lcd /opt/
Local directory now /opt
ftp> !ls
demo.txt
然后执行文件上传命令:
ftp> put "demo.txt"
227 Entering Passive Mode (192,168,56,10,169,170).
150 Ok to send data.
226 Transfer complete.
141825 bytes sent in 8e-05 secs (1772812.54 Kbytes/sec)
命令格式为:put [filename] [newfilename]
,filename 为本地文件名,newfilename 为上传到服务后的文件名,如果省略 newfilename 则上传前后名称相同。
②、处理匿名上传文件问题:
如果使用 anonymous
匿名用户进行文件上传的话会报553错误:
200 PORT command successful. Consider using PASV.
553 Could not create file.
所以,我们需要在 ftp 共享根目录上创建一个 777 权限的目录给匿名用户上传文件(注意:如果重启了 vsftpd
服务程序的话,该目录上传功能会失效):
$ mkdir /var/ftp/upload
$ chmod -R 777 /var/ftp/upload/
然后上传文件时切换到改目录中:
ftp> cd upload
250 Directory successfully changed.
ftp> put "demo.txt"
如果还报错的话就需要关闭 selinux 的限制:
$ getsebool -a | grep ftp
allow_ftpd_anon_write --> off
allow_ftpd_full_access --> off
allow_ftpd_use_cifs --> off
allow_ftpd_use_nfs --> off
ftpd_anon_write --> off
ftp_home_dir --> off
ftpd_connect_db --> off
httpd_enable_ftp_server --> off
sftpd_anon_write --> off
sftpd_enable_homedirs --> off
sftpd_full_access --> off
sftpd_write_ssh_home --> off
tftp_anon_write --> off
设置允许匿名写文件:
$ setsebool -P allow_ftpd_anon_write on
$ setsebool -P allow_ftpd_full_access on
$ setsebool -P ftpd_anon_write on
Tip:
文件传输可以使用 FTP 专用工具来进行,这里推荐一款开源的 FTP 工具:FileZilla
五、ftp 常用命令
1、查看服务器目录:
ftp> dir
drwxr-xr-x 2 0 0 6 Jun 09 16:15 pub
drwxrwxrwx 2 0 0 37 Jul 08 07:52 upload
2、查看当面目录的文件列表:
ftp> ls
-rw------- 1 14 50 19751081 Jul 08 07:52 demo.txt
3、进入服务器指定目录:
ftp> cd upload
250 Directory successfully changed.
4、查看当前所在目录:
ftp> pwd
257 "/upload"
5、查看当前的传输方式(默认情况下,FTP为ASCII码传输方式):
ftp> type
Using ascii mode to transfer files.
6、切换传输方式:
ftp> ascii
200 Switching to ASCII mode.
ftp> binary
200 Switching to Binary mode.
7、文件下载:
ftp> get [filename] [newname]
ftp> mget [filename] [filename...]
对于 get
如果 newname 不指定则使用原文件保存, mget
为批量下载命令,可以使用通配符:mget *.mp3
8、文件上传:
ftp> put [filename] [newname]
ftp> send [filename] [newname]
这里的 send
和 put
方法用法都基本相同,但是上传速度send却要比put快很多。