FTP

Posted tanshouke

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FTP相关的知识,希望对你有一定的参考价值。

博主本人平和谦逊,热爱学习,读者阅读过程中发现错误的地方,请帮忙指出,感激不尽


 一、FTP简介

1.1.FTP文件传输协议

一般来讲,人们将计算机联网的首要目的就是获取资料,而文件传输是一种非常重要的获取资料的方式。今天的互联网是由几千万台个人计算机、工作站、服务器、小型机、大型机、巨型机等具有不同型号、不同架构的物理设备共同组成的,而且即便是个人计算机,也可能会装有Windows、Linux、UNIX、Mac等不同的操作系统。为了能够在如此复杂多样的设备之间解决问题解决文件传输问题,文件传输协议(FTP)应运而生。

FTP是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用20、21号端口,其中端口20(数据端口)用于进行数据传输,端口21(命令端口)用于接受客户端发出的相关FTP命令与参数。FTP服务器普遍部署于内网中,具有容易搭建、方便管理的特点。而且有些FTP客户端工具还可以支持文件的多点下载以及断点续传技术,因此FTP服务得到了广大用户的青睐。

技术图片

1.2.FTP模式

FTP服务器是按照FTP协议在互联网上提供文件存储和访问服务的主机,FTP客户端则是向服务器发送连接请求,以建立数据传输链路的主机。FTP协议有下面两种工作模式。

主动模式FTP服务器主动向客户端发起连接请求。(一个主动模式的FTP连接建立要遵循以下步骤:

  • 客户端打开一个随机的端口(端口号大于1024,在这里,我们称它为x),同时一个FTP进程连接至服务器的21号命令端口。此时,源端口为随机端口x,在客户端,远程端口为21,在服务器。
  • 客户端开始监听端口(x+1),同时向服务器发送一个端口命令(通过服务器的21号命令端口),此命令告诉服务器客户端正在监听的端口号并且已准备好从此端口接收数据。这个端口就是我们所知的数据端口。
  • 服务器打开20号源端口并且建立和客户端数据端口的连接。此时,源端口为20,远程数据端口为(x+1)。
  • 客户端通过本地的数据端口建立一个和服务器20号端口的连接,然后向服务器发送一个应答,告诉服务器它已经建立好了一个连接。

被动模式FTP服务器等待客户端发起连接请求(FTP的默认工作模式)。

在被动方式FTP中,命令连接和数据连接都由客户端发起,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。

当开启一个 FTP连接时,客户端打开两个任意的非特权本地端口(N > 1024和N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交 PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P > 1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。

对于服务器端的防火墙来说,必须允许下面的通讯才能支持被动方式的FTP:

  • 从任何大于1024的端口到服务器的21端口 (客户端的初始化连接)
  • 服务器的21端口到任何大于1024的端口 (服务器响应到客户端的控制端口的连接)
  • 从任何大于1024端口到服务器的大于1024端口 (客户端初始化数据连接到服务器指定的任意端口)
  • 服务器的大于1024端口到远程的大于1024的端口(服务器发送ACK响应和数据到客户端的数据端口)

1.3.vsftpd

(very secure ftp daemon,非常安全的FTP守护进程)是一款运行在Linux操作系统上的FTP服务程序,不仅完全开源而且免费,此外,还具有很高的安全性、传输速度,以及支持虚拟用户验证等其他FTP服务程序不具备的特点。vsftpd作为更加安全的文件传输的服务程序,允许用户以三种认证模式登录到FTP服务器上。

 

匿名开放模式:是一种最不安全的认证模式,任何人都可以无需密码验证而直接登录到FTP服务器。

本地用户模式:是通过Linux系统本地的账户密码信息进行认证的模式,相较于匿名开放模式更安全,而且配置起来也很简单。但是如果被黑客破解了账户的信息,就可以畅通无阻地登录FTP服务器,从而完全控制整台服务器。

虚拟用户模式是这三种模式中最安全的一种认证模式,它需要为FTP服务单独建立用户数据库文件,虚拟出用来进行口令验证的账户信息,而这些账户信息在服务器系统中实际上是不存在的,仅供FTP服务程序进行认证使用。这样,即使黑客破解了账户信息也无法登录服务器,从而有效降低了破坏范围和影响。

1.3.1.vsftpd服务程序常用的参数以及作用

参数

作用

listen=[YES|NO]

是否以独立运行的方式监听服务

listen_address=IP地址

设置要监听的IP地址

listen_port=21

设置FTP服务的监听端口

download_enable=[YES|NO]

是否允许下载文件

userlist_enable=[YES|NO]
userlist_deny=[YES|NO]

设置用户列表为“允许”还是“禁止”操作

max_clients=0

最大客户端连接数,0为不限制

max_per_ip=0

同一IP地址的最大连接数,0为不限制

anonymous_enable=[YES|NO]

是否允许匿名用户访问

anon_upload_enable=[YES|NO]

是否允许匿名用户上传文件

anon_umask=022

匿名用户上传文件的umask值

anon_root=/var/ftp

匿名用户的FTP根目录

anon_mkdir_write_enable=[YES|NO]

是否允许匿名用户创建目录

anon_other_write_enable=[YES|NO]

是否开放匿名用户的其他写入权限(包括重命名、删除等操作权限)

anon_max_rate=0

匿名用户的最大传输速率(字节/秒),0为不限制

local_enable=[YES|NO]

是否允许本地用户登录FTP

local_umask=022

本地用户上传文件的umask值

local_root=/var/ftp

本地用户的FTP根目录

chroot_local_user=[YES|NO]

是否将用户权限禁锢在FTP目录,以确保安全

local_max_rate=0

本地用户最大传输速率(字节/秒),0为不限制

二、FTP安装部署

2.1.服务器信息

server:192.168.247.17

desktop:192.168.181.18

2.2.安装

[root@server ~]# firewall-cmd --permanent --add-service=ftp 
success
[root@server ~]# firewall-cmd --reload 
success
[root@server ~]# yum install vsftpd -y
[root@server ~]# yum install ftp -y  #linux ftp 管理工具

2.3.配置VsFTP匿名访问模式

注意:

vsftpd服务程序中,匿名开放模式是最不安全的一种认证模式。任何人都可以无需密码验证而直接登录到FTP服务器。这种模式一般用来访问不重要的公开文件(在生产环境中尽量不要存放重要文件)。当然,如果采用之前介绍的防火墙管理工具(如Tcp_wrappers服务程序)将vsftpd服务程序允许访问的主机范围设置为企业内网,也可以提供基本的安全性。

vsftpd服务程序默认开启了匿名开放模式,我们需要做的就是开放匿名用户的上传、下载文件的权限,以及让匿名用户创建、删除、更名文件的权限。需要注意的是,针对匿名用户放开这些权限会带来潜在危险,我们只是为了在Linux系统中练习配置vsftpd服务程序而放开了这些权限,不建议在生产环境中如此行事。

下表罗列了可以向匿名用户开放的权限参数以及作用

参数

作用

anonymous_enable=YES

允许匿名访问模式

anon_umask=022

匿名用户上传文件的umask值

anon_upload_enable=YES

允许匿名用户上传文件

anon_mkdir_write_enable=YES

允许匿名用户创建目录

anon_other_write_enable=YES

允许匿名用户修改目录名称或删除目录

2.3.1.修改配置

[root@server ~]# cd /etc/vsftpd/
[root@server vsftpd]# mv vsftpd.conf vsftpd.conf.bak
[root@server vsftpd]# cat vsftpd.conf.bak |grep -v # >vsftpd.conf
[root@server vsftpd]#
修改为:
[root@server vsftpd]# cat vsftpd.conf
anonymous_enable=YES    #允许匿名访问模式
anon_umask=022  #匿名用户上传文件的umask值
anon_upload_enable=YES  #允许匿名用户上传文件
anon_mkdir_write_enable=YES     #允许匿名用户创建目录
anon_other_write_enable=YES     #允许匿名用户修改目录名称或删除目录
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
[root@server vsftpd]# systemctl enable vsftpd
[root@server vsftpd]# systemctl restart vsftpd

 2.3.2.匿名用户访问验证

[root@server vsftpd]# ftp 192.168.181.17
Connected to 192.168.181.17 (192.168.181.17).
220 (vsFTPd 3.0.2)
Name (192.168.181.17:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> ls
227 Entering Passive Mode (192,168,181,17,39,186).
150 Here comes the directory listing.
drwxr-xr-x    2 0        0               6 Oct 30  2018 pub
226 Directory send OK.
ftp> cd pub
250 Directory successfully changed.
ftp> pwd
257 "/pub"
ftp> mkdir test01
550 Permission denied.
ftp> 
在vsftpd服务程序的匿名开放认证模式下,默认访问的是/var/ftp目录。查看该目录的权限得知,只有root管理员才有写入权限。怪不得系统会拒绝操作呢!下面将目录的所有者身份改成系统账户ftp即可
[root@server ~]# cat /etc/passwd|grep ftp
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@server ~]# 
[root@server ftp]# pwd
/var/ftp
[root@server ftp]# ls
pub
[root@server ftp]# ls -ldZ
drwxr-xr-x. root root system_u:object_r:public_content_t:s0 .
[root@server ftp]# chown -Rf ftp /var/ftp/pub
需要重新登录:
tp> exit
221 Goodbye.
[root@server vsftpd]# ftp 192.168.181.17
Connected to 192.168.181.17 (192.168.181.17).
220 (vsFTPd 3.0.2)
Name (192.168.181.17:root): anonymous   
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
ftp> mkdir test01
550 Create directory operation failed.
ftp> 
系统再次报错!尽管我们在使用ftp命令登入FTP服务器后,再创建目录时系统依然提示操作失败,但是报错信息却发生了变化。在没有写入权限时,系统提示“权限拒绝”(Permission denied)所以怀疑是权限的问题。但现在系统提示“创建目录的操作失败”(Create directory operation failed),想必各位读者也应该意识到是SELinux服务在“捣乱”了吧。
[root@server ~]# getsebool -a | grep ftp
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
tftp_home_dir --> off
[root@server ~]# setsebool -P ftpd_full_access=on
[root@server ~]#
[root@server vsftpd]# ftp 192.168.181.17
Connected to 192.168.181.17 (192.168.181.17).
220 (vsFTPd 3.0.2)
Name (192.168.181.17:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir test01
257 "/pub/test01" created
ftp> 

 小结:ftp设置匿名访问需要开通共享目录的读写权限(也就是将目录用户设置成为ftp用户),其次需要开通selinux权限,默认共享目根录为:/var/ftp/

 2.3.3.匿名用户上传下载

  • Windows

上传:test02.txt

技术图片

 技术图片

 技术图片

 下载:test02.txt

技术图片

 技术图片

  • Linux

 上传test03.txt

[root@desktop ~]# curl -u anonymous -T /opt/test03 ftp://192.168.181.17/pub/
Enter host password for user anonymous:
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100     7    0     0  100     7      0    327 --:--:-- --:--:-- --:--:--   350
[root@desktop ~]# 

下载test03:

[root@desktop ~]# curl ftp://192.168.181.17/pub/test03 -O
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100     7  100     7    0     0    352      0 --:--:-- --:--:-- --:--:--   368
[root@desktop ~]# ls
anaconda-ks.cfg  test03
[root@desktop ~]# 
或是:
[root@desktop ~]# wget -O test.txt  ftp://192.168.181.17/pub/test03 
--2020-01-23 20:20:39--  ftp://192.168.181.17/pub/test03
           => ‘test.txt’
Connecting to 192.168.181.17:21... connected.
Logging in as anonymous ... Logged in!
==> SYST ... done.    ==> PWD ... done.
==> TYPE I ... done.  ==> CWD (1) /pub ... done.
==> SIZE test03 ... 7
==> PASV ... done.    ==> RETR test03 ... done.
Length: 7 (unauthoritative)

100%[======================================>] 7           --.-K/s   in 0s      

2020-01-23 20:20:39 (652 KB/s) - ‘test.txt’ saved [7]

[root@desktop ~]# ls
anaconda-ks.cfg  test.txt
[root@desktop ~]# 

2.4.配置VsFTP本地用户访问模式

相较于匿名开放模式,本地用户模式要更安全,而且配置起来也很简单,

针对本地用户模式的权限参数以及作用如下表所示

参数

作用

anonymous_enable=NO

禁止匿名访问模式

local_enable=YES

允许本地用户模式

write_enable=YES

设置可写权限

local_umask=022

本地用户模式创建文件的umask值

userlist_deny=YES

启用“禁止用户名单”,名单文件为ftpusers和user_list(默认用户列表/etc/vsftpd/user_list,/etc/vsftpd/ftpusers ),相当于黑白名单 。也就是说yes表示黑名单,no则表示白名单

userlist_enable=YES

开启用户作用名单文件功能,相当于开启自定义黑白名单

userlist_file=/yy/userlist (自定义用户列表,与userlist_deny相结合)

2.4.1.设置ftp本地用户配置

[root@server vsftpd]# vim vsftpd.conf
  
anonymous_enable=no
local_enable=YES
write_enable=YES
local_umask=022
userlist_deny=YES
userlist_enable=YES
userlist_file=/etc/vsftpd/userfile

dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

测试用户:
[root@server vsftpd]# echo "user01" >>/etc/vsftpd/userfile

2.4.2.本地用户测试验证

(在黑名单里面的user01与不在用户列表里面的tansk)

[root@server vsftpd]# systemctl restart vsftpd
[root@server vsftpd]# ftp 192.168.181.17
Connected to 192.168.181.17 (192.168.181.17).
220 (vsFTPd 3.0.2)
Name (192.168.181.17:root): user01
530 Permission denied.
Login failed.
ftp> exit
221 Goodbye.
[root@server vsftpd]# ftp 192.168.181.17
Connected to 192.168.181.17 (192.168.181.17).
220 (vsFTPd 3.0.2)
Name (192.168.181.17:root): tansk
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/home/tansk"
ftp> mkdir test04
257 "/home/tansk/test04" created
ftp> 

2.4.3.ftp本地用户的上传与下载

请参考上文内容

2.5.ftp虚拟用户模式

虚拟用户模式是这三种模式中最安全的一种认证模式,当然,因为安全性较之于前面两种模式有了提升,所以配置流程也会稍微复杂一些,一共有五个步骤。

 2.5.1创建虚拟用户:chulx、lixh

其中奇数行为账户名,偶数行为密码

[root@server ~]# cd /etc/vsftpd/
[root@server vsftpd]# ls
ftpusers    vsftpd.conf  vsftpd.conf.bak  vsftpd_conf_migrate.sh
[root@server vsftpd]# vim vuser.list
chulx
123456
lixh
123456

 但是,明文信息既不安全,也不符合让vsftpd服务程序直接加载的格式,因此需要使用db_load命令用哈希(hash)算法将原始的明文信息文件转换成数据库文件,并且降低数据库文件的权限(避免其他人看到数据库文件的内容),然后再把原始的明文信息文件删除。

[root@server vsftpd]# db_load -T -t hash -f vuser.list vuser.db  #参数解释: T 表示命名为 vuser.db ; t 表示加密方式 ; f 表示对谁加密
[root@server vsftpd]# file vuser.db
vuser.db: Berkeley DB (Hash, version 9, native byte-order)
[root@server vsftpd]# chmod 600 vuser.db  #用户信息的文件一定要将权限设置成为600
[root@server vsftpd]# rm -f vuser.list
[root@server vsftpd]# ls -l
total 36
-rw-------. 1 root root   125 Oct 30  2018 ftpusers
-rw-r--r--. 1 root root     7 Jan 23 21:01 userfile
-rw-------. 1 root root   361 Oct 30  2018 user_list
-rw-r--r--. 1 root root   321 Jan 23 20:57 vsftpd.conf
-rw-------. 1 root root  5116 Oct 30  2018 vsftpd.conf.bak
-rwxr--r--. 1 root root   338 Oct 30  2018 vsftpd_conf_migrate.sh
-rw-------. 1 root root 12288 Jan 23 22:07 vuser.db
[root@server vsftpd]#

 2.5.2.创建根目录与映射用户

创建vsftpd服务程序用于存储文件的根目录以及虚拟用户映射的系统本地用户。FTP服务用于存储文件的根目录指的是,当虚拟用户登录后所访问的默认位置。

由于Linux系统中的每一个文件都有所有者、所属组属性,例如使用虚拟账户“楚留香”新建了一个文件,但是系统中找不到账户“楚留香”,就会导致这个文件的权限出现错误。为此,需要再创建一个可以映射到虚拟用户的系统本地用户。简单来说,就是让虚拟用户默认登录到与之有映射关系的这个系统本地用户的家目录中,虚拟用户创建的文件的属性也都归属于这个系统本地用户,从而避免Linux系统无法处理虚拟用户所创建文件的属性权限。

为了方便管理FTP服务器上的数据,可以把这个系统本地用户的家目录设置为/var目录(该目录用来存放经常发生改变的数据)。并且为了安全起见,我们将这个系统本地用户设置为不允许登录FTP服务器,这不会影响虚拟用户登录,而且还可以避免黑客通过这个系统本地用户进行登录。

[root@server ~]# useradd -d /var/ftproot -s /sbin/nologin virtual
[root@server ~]# ls -ld /var/ftproot/
drwx------. 2 virtual virtual 62 Jan 23 22:11 /var/ftproot/
[root@server ~]# chmod -Rf 755 /var/ftproot/ 
[root@server ~]# 

2.5.3.建立用于支持虚拟用户的PAM文件

PAM(可插拔认证模块)是一种认证机制,通过一些动态链接库和统一的API把系统提供的服务与认证方式分开,使得系统管理员可以根据需求灵活调整服务程序的不同认证方式。

通俗来讲,PAM是一组安全机制的模块,系统管理员可以用来轻易地调整服务程序的认证方式,而不必对应用程序进行任何修改。PAM采取了分层设计(应用程序层、应用接口层、鉴别模块层)的思想,其结构如下图所示。

技术图片

新建一个用于虚拟用户认证的PAM文件vsftpd.vu,其中PAM文件内的“db=”参数为使用db_load命令生成的账户密码数据库文件的路径,但不用写数据库文件的后缀(也就是说省略“.db”):

[root@server ~]# vim /etc/pam.d/vsftpd.vu
auth       required     pam_userdb.so db=/etc/vsftpd/vuser
account    required     pam_userdb.so db=/etc/vsftpd/vuser

2.5.4.设置配置文件,建立连接

vsftpd服务程序的主配置文件中通过pam_service_name参数将PAM认证文件的名称修改为vsftpd.vu,PAM作为应用程序层与鉴别模块层的连接纽带,可以让应用程序根据需求灵活地在自身插入所需的鉴别功能模块。当应用程序需要PAM认证时,则需要在应用程序中定义负责认证的PAM配置文件,实现所需的认证功能。

例如,vsftpd服务程序的主配置文件中默认就带有参数pam_service_name=vsftpd,表示登录FTP服务器时是根据/etc/pam.d/vsftpd文件进行安全认证的。现在我们要做的就是把vsftpd主配置文件中原有的PAM认证文件vsftpd修改为新建的vsftpd.vu文件即可。该操作中用到的参数以及作用如下表所示。

 利用PAM文件进行认证时使用的参数以及作用

参数

作用

anonymous_enable=NO

禁止匿名开放模式

local_enable=YES

允许本地用户模式

guest_enable=YES

开启虚拟用户模式

guest_username=virtual

指定虚拟用户账户

pam_service_name=vsftpd.vu

指定PAM文件

 

[root@server vsftpd]# cat /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
guest_enable=YES
guest_username=virtual
pam_service_name=vsftpd.vu
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
#pam_service_name=vsftpd 将其修改为上面的vsftpd.vu
userlist_enable=YES
tcp_wrappers=YES

2.5.5.设置权限

为虚拟用户设置不同的权限。虽然账户chulx和lixh都是用于vsftpd服务程序认证的虚拟账户,但是我们依然想对这两人进行区别对待。比如,允许楚留香上传、创建、修改、查看、删除文件,只允许李寻欢查看文件。这可以通过vsftpd服务程序来实现。只需新建一个目录,在里面分别创建两个以chulx和lixh命名的文件,其中在名为chulx的文件中写入允许的相关权限(使用匿名用户的参数):

[root@server ~]# mkdir /etc/vsftpd/vusers_dir/
[root@server ~]# cd /etc/vsftpd/vusers_dir/
[root@server vusers_dir]# touch chulx
[root@server vusers_dir]# touch lixh
[root@server vusers_dir]# vim chulx 
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

然后再次修改vsftpd主配置文件,通过添加user_config_dir参数来定义这两个虚拟用户不同权限的配置文件所存放的路径:

[root@server ~]# vim /etc/vsftpd/vsftpd.conf 
  
anonymous_enable=NO
local_enable=YES
guest_enable=YES
guest_username=virtual
pam_service_name=vsftpd.vu
user_config_dir=/etc/vsftpd/vusers_dir
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
userlist_enable=YES
tcp_wrappers=YES

[root@server ~]# systemctl restart vsftpd
[root@server ~]# systemctl enable vsftpd

[root@server vusers_dir]# getsebool -a | grep ftp
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
tftp_home_dir --> off
[root@server vusers_dir]# setsebool -P ftpd_full_access=on

[root@server vusers_dir]# ftp 192.168.181.17
Connected to 192.168.181.17 (192.168.181.17).
220 (vsFTPd 3.0.2)
Name (192.168.181.17:root): chulx
331 Please specify the password.
Password:
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
Login failed.
421 Service not available, remote server has closed connection
ftp> pwd
Not connected.
ftp> exit

[root@server vsftpd]# vim vsftpd.conf
anonymous_enable=NO
local_enable=YES
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=YES
pam_service_name=vsftpd.vu
user_config_dir=/etc/vsftpd/vusers_dir
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
userlist_enable=YES
tcp_wrappers=YES

 

再次登录,发现楚留香可以创建文件等操作,而李寻欢不行:

[root@server vsftpd]# ftp 192.168.181.17
Connected to 192.168.181.17 (192.168.181.17).
220 (vsFTPd 3.0.2)
Name (192.168.181.17:root): chulx
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> mkdir test01
257 "/test01" created
ftp> exit
221 Goodbye.
[root@server vsftpd]# ftp 192.168.181.17
Connected to 192.168.181.17 (192.168.181.17).
220 (vsFTPd 3.0.2)
Name (192.168.181.17:root): lixh
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir test02
550 Permission denied.
ftp>

此时,不但可以使用虚拟用户模式成功登录到FTP服务器,还可以分别使用账户chulx和lixh来检验他们的权限。当然,读者在生产环境中一定要根据真实需求来灵活配置参数

三、常用的ftp命令

该小节转自:https://www.jb51.net/article/103904.htm,如有侵权,请联系删除

FTP命令

技术图片
ftp> ascii # 设定以ASCII方式传送文件(缺省值) 
ftp> bell  # 每完成一次文件传送,报警提示. 
ftp> binary # 设定以二进制方式传送文件. 
ftp> bye  # 终止主机FTP进程,并退出FTP管理方式. 
ftp> case # 当为ON时,用MGET命令拷贝的文件名到本地机器中,全部转换为小写字母. 
ftp> cd   # 同UNIX的CD命令. 
ftp> cdup  # 返回上一级目录. 
ftp> chmod # 改变远端主机的文件权限. 
ftp> close # 终止远端的FTP进程,返回到FTP命令状态, 所有的宏定义都被删除. 
ftp> delete # 删除远端主机中的文件. 
ftp> dir [remote-directory] [local-file] # 列出当前远端主机目录中的文件.如果有本地文件,就将结果写至本地文件. 
ftp> get [remote-file] [local-file] # 从远端主机中传送至本地主机中. 
ftp> help [command] # 输出命令的解释. 
ftp> lcd # 改变当前本地主机的工作目录,如果缺省,就转到当前用户的HOME目录. 
ftp> ls [remote-directory] [local-file] # 同DIR. 
ftp> macdef         # 定义宏命令. 
ftp> mdelete [remote-files] # 删除一批文件. 
ftp> mget [remote-files]  # 从远端主机接收一批文件至本地主机. 
ftp> mkdir directory-name  # 在远端主机中建立目录. 
ftp> mput local-files # 将本地主机中一批文件传送至远端主机. 
ftp> open host [port] # 重新建立一个新的连接. 
ftp> prompt      # 交互提示模式. 
ftp> put local-file [remote-file] # 将本地一个文件传送至远端主机中. 
ftp> pwd # 列出当前远端主机目录. 
ftp> quit # 同BYE. 
ftp> recv remote-file [local-file] # 同GET. 
ftp> rename [from] [to]   # 改变远端主机中的文件名. 
ftp> rmdir directory-name  # 删除远端主机中的目录. 
ftp> send local-file [remote-file] # 同PUT. 
ftp> status  # 显示当前FTP的状态. 
ftp> system  # 显示远端主机系统类型. 
ftp> user user-name [password] [account] # 重新以别的用户名登录远端主机. 
ftp> ? [command] # 同HELP. [command]指定需要帮助的命令名称。如果没有指定 command,ftp 将显示全部命令的列表。
ftp> ! # 从 ftp 子系统退出到外壳。 
技术图片

关闭FTP连接

bye

exit

quit

下载文件

ftp> get readme.txt # 下载 readme.txt 文件
ftp> mget *.txt   # 下载

上传文件

ftp> put /path/readme.txt # 上传 readme.txt 文件
ftp> mput *.txt      # 可以上传多个文件

状态码

•230 - 登录成功
•200 - 命令执行成功
•150 - 文件状态正常,开启数据连接端口
•250 - 目录切换操作完成
•226 - 关闭数据连接端口,请求的文件操作成功

 


 

转载需注明出处

 

以上是关于FTP的主要内容,如果未能解决你的问题,请参考以下文章

七个办法只有一个有效:200 PORT command successful. Consider using PASV.425 Failed to establish connection.(代码片段

Maven FTP部署:无法创建目录

FTP传大文件又慢又麻烦,有没有更好的替代传输方案?

微信小程序代码片段

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js