【Linux】之 FTP 服务

平台: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]

这里的 sendput 方法用法都基本相同,但是上传速度send却要比put快很多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值