Linux搭建FTP服务器

2023-11-01

什么是FTP?

  • 百度百科:文件传输协议(英文:File Transfer Protocol,缩写:FTP)是用于在网络上进行文件传输的一套标准协议,使用客户/服务器模式。它属于网络传输协议的应用层。文件传送(file transfer)和文件访问(file access)之间的区别在于:前者由FTP提供,后者由如NFS等应用系统提供。

FTP相关信息

FTP工作流程

  • 用户通过一个FTP用户接口与FTP交互。
    (1)首先,用户提供远程主机的主机名,使本地主机的FTP客户进程建立一个到远程FTP服务器进程的TCP连接;
    (2)接着,该用户提供用户标识和口令,作为FTP的一部分在该TCP连接上传送;
    (3)一旦该服务器向该用户授权,用户可以将存放在本地文件系统的一个或多个文件复制到远程文件系统。
    在这里插入图片描述

FTP与HTTP区别

  • FTP是带外(out-of-band)传送的,它使用了两个并行的TCP连接来传输文件:控制连接(在两主机间传输控制信息)和数据连接(传输文件)。
    HTTP是在传送文件的同一个TCP里发送请求和响应首部行的,是带内(in-band)传送。
  • FTP服务器必须在整个会话期间保留用户的状态,大大限制了FTP同时维护的会话总数。而HTTP服务器是无状态的,不必对任何用户状态进行跟踪。
    在这里插入图片描述
  • 注意:数据连接是非持续的,每一次文件传输都要建立一个新的数据连接。

FTP相关软件包

yum  search  ftp			##与ftp相关的软件包

图片

  • 通常使用vsftp(very secure FTP)作为FTP服务器软件,更为安全一些。
  • 通常使用lftp作为FTP客户端软件(相当于我们的浏览器)。

FTP默认配置信息

  • FTP默认发布目录
/var/ftp     		##ftp服务器的默认发布目录
  • FTP使用传输协议:TCP
  • FTP端口:20(控制连接)、21(数据传输)
  • 相关配置文件
rpm  -qc  vsftpd					##查看vsftp的配置文件名称

图片

FTP相关状态码

500 文件系统权限过大
530 用户认证失败(密码错误或者服务器设置禁止登陆)
550 服务本身功能未开启(说明服务配置有问题)
553 本地文件系统权限过小

更详细的状态码:点击这里

部署FTPserver

  • 先关闭内核级加强型火墙selinux:(reboot后才会生效)
getenforce							##查看selinux状态:enforcing为开启,disable关闭
vim  /etc/sysconfig/selinux			##修改selinux配置文件
reboot

在这里插入图片描述
在这里插入图片描述

  • 安装vsftp(非常安全的FTP服务器软件)、lftp(FTP客户端软件)
    前提是提前搭建好yum源,搭建方法点击这里:Linux中yum使用大全
yum install vsftpd lftp -y 
systemctl start vsftpd
systemctl enable vsftpd
systemctl status vsftpd

在这里插入图片描述
在这里插入图片描述

  • 设置火墙运行FTP服务
firewall-cmd  --list-all								##查看火墙相关的服务
firewall-cmd  --permanent  --add-service=ftp   		##火墙永久允许FTP服务
firewall-cmd  --reload									##重载火墙设置,使其生效

图片
在这里插入图片描述

  • 测试实验:
    (1)使用lftp
    图
    (2)浏览器地址测试
    图

lftp客户端的一些命令

  • 使用以下方式登录FTP服务器:
    lftp ftp://用户名[:密码]@服务器地址[:端口] #标准方式,推荐
    lftp 用户名[:密码]@服务器地址[:端口]
    lftp 服务器地址 [-p 端口] -u 用户名[,密码]
    lftp 服务器地址[:端口] -u 用户名[,密码]
  • 使用方法:
    (1)确认当前目录工作
命令 本地 远程
显示工作目录 lpwd pwd
切换目录 lcd cd
显示文件列表 !ls cls
显示文件列表 !ls -l ls
  • 注意:!表示执行本地命令,lftp中没有lls这个指令,所以要用!ls查看本地文件
    (2)上传下载
上传 下载
单个文件 get put
多个文件 mget mput
多个线程 pget
目录 mirror mirror -R
  • (3)在远程目录中,可以使用以下命令操作文件
统计文件大小 du
移动、重命名 mv
删除 rm
创建文件夹 mkdir
删除文件夹 rmdir

FTP具体配置

  • FTP的主要配置是通过修改/etc/vsftpd/vsftpd.conf这个配置文件的相关信息

匿名用户相关配置

  • (1)匿名用户是否可以登录
anonymous_enable=YES/NO				##匿名用户是否可以登录
  • (2)ftp服务器是否对登录用户可写
write_enable=YES/NO					##登录用户是否可写,实验效果?

两内容图片放一起

  • (3)匿名用户上传
    上传是对FTP服务器写的动作,所以首先要开启对登录用户可写;其次要开启上传功能。
vim  /etc/vsftpd/vsftpd.conf
修改内容:write_enable=YES    anon_upload_enable=YES
systemctl  restart  vsftpd  			##完成之后重启服务

图片
在这里插入图片描述

  • 发现还是无法上传,排查原因,550,说明我们的服务配置有问题。由于我们上传的目录是在vsftp发布目录/var/ftp,查看其权限,发现所属用户和组为root,但是由于上传命令的发起者是FTP,也就是说FTP想对此目录获取root一样的读写权利,我们可以用修改其所属组为FTP,给组用户的权限为7,也可以使用acl权限列表,对此目录加入ftp用户,获取权限也为7,即可。但通常情况下,为了安全,建议只能修改发布目录下目录文件的权限,即修改/var/ftp/pub的权限。
方法一:
	chmod   775   /var/ftp/pub
	chgrp   ftp   /var/ftp/pub
方法二:
	setfacl  -m  u:ftp:rwx  /var/ftp/pub
	getfacl  /var/ftp/pub

再次测试,发现生效。
图片
在这里插入图片描述

  • (4)匿名用户家目录修改
anon_root=/westos

图

  • (5)匿名用户上传文件默认权限修改
anon_umask=022

图
在这里插入图片描述

  • (6)匿名用户建立目录
anon_mkdir_write_enable=YES

图
在这里插入图片描述

  • (7)匿名用户下载
anon_world_readable_only=NO			##匿名用户只读为NO,表示不只是读,可以下载get

在这里插入图片描述
在这里插入图片描述

  • (8)匿名用户可对共享目录进行删除操作
anon_other_write_enable=YES			##匿名用户其他写功能,删除、重命名(mv)

在这里插入图片描述
在这里插入图片描述

  • (9)匿名用户使用的用户身份修改
chown_uploads=YES						##修改用户是否可以上传
chown_username=student					##修改用户身份为student	
chown_upload_mode=0644					##修改用户上传的文件权限

图
在这里插入图片描述
在这里插入图片描述

  • (10)最大上传速率
anon_max_rate=102400				#单位是字节(bytes)

在这里插入图片描述
测试:
在这里插入图片描述
在这里插入图片描述

  • (11)能够最大连接的客户端数
max_clients=2			#最多两个客户端同时访问ftp服务器

本地用户相关配置

  • (1)本地用户是否可以登录,是否可写
local_enable=YES/NO					##本地用户是否可以登录
write_enable=YES/NO  				##本地用户写权限限制

图
在这里插入图片描述

  • (2)本地用户家目录修改
local_root=/dir

在这里插入图片描述
在这里插入图片描述

  • (3)本地用户上传文件权限
local_umask=077
  • (4)限制本地用户浏览/目录
 chroot_local_user=YES				#所有用户被锁定到自己的家目录中

在这里插入图片描述
对比图
在这里插入图片描述

 chmod ugo-w /home/*			##用户家目录去除写权限后才可以浏览自己的家目录,可能跟chroot_local_user冲突

图
在这里插入图片描述
在这里插入图片描述

  • (5)用户限制访问黑名单(只能访问自己家目录,不能访问服务器上其他目录)
chroot_local_user=NO   ##黑名单
 chroot_list_enable=YES
 chroot_list_file=/etc/vsftpd/chroot_list

在/etc/vsftpd/chroot_list 写入黑名单用户即可。
图
在这里插入图片描述

  • (6)用户限制访问白名单
 chroot_local_user=YES  ##白名单
 chroot_list_enable=YES
 chroot_list_file=/etc/vsftpd/chroot_list

图效果

  • (7)用户登录黑名单:a.永久黑名单(优先级最高);b.临时黑名单
vim /etc/vsftpd/ftpusers  			##用户黑名单
vim /etc/vsftpd/user_list   		##用户临时黑名单

图
在这里插入图片描述

  • (8)用户登录白名单
    当永久黑名单(级别高)中出现用户westos时,及时白名单中有westos,也不能登录!
vim  /etc/vsftp/vsftpd.conf		
写入:userlist_deny=NO						##让黑名单变为白名单
vim /etc/vsftpd/user_list 					##参数设定,文件变成用户白名单,只在名单中出现的用户才可以登录ftp

虚拟用户相关配置

  • 作用:为了安全,需要使用虚拟账户登录服务器,一方面方便管理,一方面获取本地用户的权限不安全。
  • (1)创建虚拟用户信息
vim  /etc/vsftpd/loginFile				##文件名随意,但需要一定可读性

在这里插入图片描述

  • (2)对虚拟用户信息文件加密
db_load  -T  -t  hash  -f  /etc/vsftpd/loginFile  /etc/vsftpd/loginFile.db			##哈希加密

图

  • (3)创建认证文件
vim  /etc/pam.d/loginFile			##在认证目录下创建一个文件,此文件就是下面需要用的认证文件
文件内容:
auth	   required   pam_userdb.so 	db=/etc/vsftpd/loginFile			##使用认证程序为pam,加密文件为loginFile
account	   required   pam_userdb.so 	db=/etc/vsftpd/loginFile			##用程序来看一个这个文件里是否存在此账户

在这里插入图片描述

  • (4)开启虚拟用户登录功能
vim  /etc/vsftpd/vsftpd.conf
写入:
pam_service_name=loginFile  			 ##写上面生成的认证文件,这样默认系统用户不能登录
guest_enable=YES     				 ##开启虚拟用户的功能

图

  • (5)虚拟帐号家目录独立设定:虚拟用户只能查看自己的目录
mkdir -p /var/ftpuserdir/westos{1..3}			##递归的创建目录
vim /etc/vsftpd/vsftpd.conf		
写入并重启服务:
local_root=/var/ftpuserdir/$USER
user_sub_token=$USER

图

mkdir  /var/ftpuserdir/westos{1..3}/pub
touch  /var/ftpuserdir/westos1/file1
touch  /var/ftpuserdir/westos2/file2
touch  /var/ftpuserdir/westos3/file3
  • (6)实验:

独立的虚拟用户相关配置

  • 为了使每个虚拟用户的功能不一,或者说权限不一,所以需要独立配置虚拟用户
  • (1)虚拟帐号家目录独立设定:虚拟用户只能查看自己的目录
mkdir -p /var/ftpuserdir/westos{1..3}			##递归的创建目录
vim /etc/vsftpd/vsftpd.conf		
写入并重启服务:
local_root=/var/ftpuserdir/$USER
user_sub_token=$USER

注意:$ USER用来表示用户身份,例如:kiosk用户的家目录是/home/kiosk,student用户的家目录是/home/student,所以我们在vsftpd.conf配置文件中将用户家目录修改为/var/ftpdir/$USER。

mkdir  /var/ftpuserdir/user{1..3}/pub
touch  /var/ftpuserdir/user1/file1
touch  /var/ftpuserdir/user2/file2
touch  /var/ftpuserdir/user3/file3
  • (2)虚拟帐号配置独立
  • 1>首先,修改其家目录权限,使FTP用户也可以对其进行写的操作
方法一:
	chmod   775   /var/ftpuserdir/westos*/pub
	chgrp   ftp   /var/ftpuserdir/westos*/pub
方法二:
	setfacl  -m  u:ftp:rwx  /var/ftpuserdir/westos*/pub
	getfacl  /var/ftpuserdor/westos*/pub
  • 2>使用指定的配置文件对虚拟用户配置参数
mkdir  -p  /etc/vsftpd/user_config
vim  /etc/vsftpd/user_config/user1
写入相关参数:
anon_upload_enable=YES

  • 3>修改vsftp配置文件,使其生效
vim /etc/vsftpd/vsftpd.conf
写入:
user_config_dir=/etc/vsftpd/user_config			##指定用户配置文件目录

  • 4>实例:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux搭建FTP服务器 的相关文章

  • 无法在 Linux 的 NetBeans 中编译 C++ 和 OpenGL (GLFW) 的简单源代码

    我开始学习 OpenGL glfw 我从教程中复制源代码并尝试编译它 但出现了错误 我想我已经正确安装了所有头文件 glm glfw 等 这是我的来源 我没有在头文件中使用这些字符 include iostream include stdi
  • linux新手关于嵌入式linux设备驱动的问题

    最近在研究linux驱动 正如我读过的那些文章所说 设备驱动程序模块很可能会根据内核的需要自动加载 因此我想知道内核如何确定为特定设备 声卡 I2C spi 设备 等 我也无法彻底想象内核如何在启动时检测每个硬件设备 与嵌入式linux相关
  • 如果文件没有行尾字符,则 wc -l 不计算文件的最后一个

    我需要计算 unix 文件的所有行数 该文件有 3 行 但是wc l仅给出 2 个计数 我知道它不计算最后一行 因为它没有行尾字符 任何人都可以告诉我如何计算这一行吗 grep c返回匹配行的数量 只需使用一个空字符串 作为您的匹配表达式
  • 确定 TCP Listen() 队列中当前积压的连接数

    有没有办法找出currentLinux 上 TCP 套接字上等待 Accept 的连接尝试次数 我想我可以在每个事件循环上点击 EWOULDBLOCK 之前计算成功的 Accept 数量 但我使用的是隐藏这些细节的高级库 Python Tw
  • Apache 端口转发 80 到 8080 并访问 Apache (80) 中托管的应用程序,即 phpMyadmin 和 Tomcat (8080)

    我想访问托管在 tomcat 服务器 8080 中的应用程序 myapp 当前可以通过以下方式访问http example com 8080 myapp http example com 8080 myapp in http example
  • Linux中如何避免sleep调用因信号而中断?

    我在 Linux 中使用实时信号来通知串行端口中新数据的到达 不幸的是 这会导致睡眠呼叫在有信号时被中断 有人知道避免这种行为的方法吗 我尝试使用常规信号 SIGUSR1 但我不断得到相同的行为 来自 nanosleep 联机帮助页 nan
  • 对于任何真实数据集,数据压缩比的最小可能值是多少

    我在写信ZLIB类似于嵌入式硬件压缩器的 API 它使用 deflate 算法来压缩给定的输入流 在进一步讨论之前 我想解释一下数据压缩率 数据压缩率定义为未压缩大小与压缩大小之间的比率 压缩比通常大于一 这意味着压缩数据通常比未压缩数据小
  • 使用脚本检查 git 分支是否领先于另一个分支

    I have branch1 and branch2我想要某种 git branch1 isahead branch2 这将显示如果branch1已承诺branch2没有 也可能指定这些提交 我无法检查差异原因branch2 is在之前br
  • 在ubuntu中打开spyder

    我想在ubuntu中打开spyder Python IDE 通常我会在 shell 中编写 spyder 它会打开spyder IDE 现在 当我在shell中编写spyder时 它只是换行 什么也没有发生 类似于按 enter 我如何找回
  • Python glob,操作系统,相对路径,将文件名放入列表中[重复]

    这个问题在这里已经有答案了 我正在尝试创建一个目录中所有文件的列表 其中文件名以 root 结尾 在阅读了论坛中的一些文章后 我尝试使用 glob 和 os listdir 的基本策略 但我都遇到了麻烦 首先 当我使用 import glo
  • 为什么此 NASM 代码会打印我的环境变量?

    本学期我刚刚完成计算机体系结构课程 除其他外 我们一直在涉足 MIPS 汇编并在 MARS 模拟器中运行它 今天 出于好奇 我开始在我的 Ubuntu 机器上摆弄 NASM 基本上只是将教程中的内容拼凑起来 并感受一下 NASM 与 MIP
  • Linux shell 从用户输入中获取设备 ID

    我正在为一个程序编写安装脚本 该程序需要在其配置中使用 lsusb 的设备 ID 因此我正在考虑执行以下操作 usblist lsusb put the list into a array for each line use the arr
  • 使用 libusb 输出不正确

    我用libusb编写了一个程序 我怀疑输出是否正确 因为所有条目都显示相同的供应商和产品 ID 以下是代码 include
  • 嵌入清单文件以要求具有 mingw32 的管理员执行级别

    我正在 ubuntu 下使用 i586 mingw32msvc 交叉编译应用程序 我很难理解如何嵌入清单文件以要求 mingw32 具有管理员执行级别 对于我的例子 我使用了这个hello c int main return 0 这个资源文
  • Linux无法删除文件

    当我找到文件时 我在删除它们时遇到问题 任务 必须找到带有空格的文件并将其删除 我的尝试 rm find L root grep i 但我有错误 rm cannot remove root test No such file or dire
  • Python 3.4.3 subprocess.Popen 在没有管道的情况下获取命令的输出?

    我试图将命令的输出分配给变量 而不让命令认为它正在通过管道传输 原因是 如果正在通过管道传输 则相关命令会给出未格式化的文本作为输出 但如果从终端运行 则会给出颜色格式化的文本 我需要获取这种颜色格式的文本 到目前为止我已经尝试了一些事情
  • Linux 使用 boost asio 拒绝套接字绑定权限

    我在绑定套接字时遇到问题 并且以用户身份运行程序时权限被拒绝 这行代码会产生错误 acceptor new boost asio ip tcp acceptor io boost asio ip tcp endpoint boost asi
  • 如何在 Linux 上通过 FTP 递归下载文件夹 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • vmsplice() 和 TCP

    在原来的vmsplice 执行 有人建议 http lwn net Articles 181169 如果您的用户态缓冲区是管道中可容纳的最大页面数的 2 倍 则缓冲区后半部分成功的 vmsplice 将保证内核使用缓冲区的前半部分完成 但事
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu

随机推荐

  • JDBC 负载均衡读取mysql cluster

    语句使用 jdbc mysql loadbalance host1 port host2 port host3 port database propertyName1 propertyValue1 propertyName2 propert
  • MIPI D-PHY的校准测试

    MIPI的校准环节类似于DDR中的读写训练 其目的都是为了满足最佳的眼图采样时刻 因此 在系统的传输速率很高 通道之间存在延时 设计中有外部干扰等等影响因素的时候 信号抖动将会被增强 此时 校准将对长时间的稳定运行起到关键的补偿作用 在MI
  • PAT C语言入门题目-7-32 求交错序列前N项和 (15 分)

    7 32 求交错序列前N项和 15 分 本题要求编写程序 计算交错序列 1 2 3 3 5 4 7 5 9 6 11 的前N项之和 输入格式 输入在一行中给出一个正整数N 输出格式 在一行中输出部分和的值 结果保留三位小数 输入样例 5 输
  • 云计算-平台架构-开源-OpenStack

    文章目录 一 是什么 1 概念 2 架构 官方角度 组件层级角度 四大节点角度 三驾马车角度 组件交互角度 核心辅助组件角度 服务角度 二 怎么用 1 安装 2 使用 OpenStack操作界面服务Horizon OpenStack认证管理
  • 【mybatis】关联查询——mybatis一对多两种方式实现详解

    一 数据库 演示的小demo涉及两张表 一张是Person表 记录用户基本信息 另一张是phone表 记录电话号码 Person的phoneID外键关联phone表id 此处示例涉及并不符合实际情况 一对多方式是一个号码有多个用户使用的 更
  • VS code : 设置编译运行快捷键

    VS code中没有编译运行的快捷按键 只能通过编写 tasks json 实现 一开始用的 launch json 里的 windows launch 配置 设置调试开始前执行一个 task 任务 task 任务设置好 gcc 编译语句
  • java.lang.ClassNotFoundException web项目加载时找不到类

    1 概述 作为一个屌丝程序猿 怎么能不会配置log4j呢 这样在控制台或者日志文件中很容易找到程序出BUG的地方 尤其是在控制台输出日志的时候 那叫一个爽啊 但是出现了问题 我擦 启动web的时候spring创建上下文的时候居然会找不到类
  • 要考研,先要做到不比钱

    今天在一场针对大三学生的教学安排活动后 一位同学提出了一个问题 目前嵌入式开发的人员招聘中 研究生和本科生的待遇能相差多少 如果要给一个统计数据 那一定是可以找到的 一起参加活动的培训企业的老师也给做了解答 通过上研究生 使自己将来的职业生
  • 【Spark NLP】第 11 章:词嵌入

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • app开发好了你还不得不了解ASO

    前言 互联网的高速发展 带我们进入到了移动互联网时代 大家又开始了一轮APP开发的热潮 也就是移动应用开发 就像PC时代 大家都会创建自己的网站一样 现在苹果应用商店已经有上百万款的移动应用 Android的应用也有60万款左右 虽然数量上
  • 单片机课程设计-温度检测(STM32)

    单片机课程设计 温度检测 STM32 原理 KEY配置 ADC配置 中断配置 UI及主函数 原理 STM32ADC采样 我选用PA5作为ADC接口 并做了UI设计 KEY配置 key c include key h include SysT
  • 第七章——二叉树

    二叉树的基本概念 二叉树类似于2次树 但和2次树有一些不同 1 度为2的树至少有一个结点的度为2 而二叉树没有这种要求 简而言之二叉树可以退化成一条链 2 度为2的树可以不区分左右子树 二叉树中左右子树 结点 的次序严格区分排列 有关满二叉
  • 网络安全——Cobaltstrike

    一 原理 CobaltStrike 以下简称 CS 工具 是攻击队常用的团队协作工具之一 本实验将由服务器和攻击机 模拟组成攻击队的CS工具环境 完成相关配置 并通过简单的攻击实践 测试协作效果 二 Cobalt Strike的安装配置服务
  • MYSQL8.0.31解压版下载、安装、环境配置

    目录 1 下载 2 解压 3 配置my ini 4 打开命令提示符 5 安装mysql服务 6 初始化mysql数据库 7 启动mysq服务 8 修改密码 9 配置环境变量 1 下载 官网 https dev mysql com downl
  • 开源无国界?vue-cli、node-ipc被投毒事件分析

    简述 近日我们监测到 Vue js 生态中的 vue cli 包遭遇供应链投毒 而被投毒的 node ipc 包在 npm 上每周下载量超百万 影响非常广泛 被投毒的情况如下 vue cli是Vue js 开发的标准工具 该工具被广泛应用于
  • 解决多线程高并发问题常用类

    Volatile关键字 1 volatile解决可见性 创建一个类继承Thread类 public class MyThread extends Thread 定义一个共享的静态成员变量 供多个线程一起使用 给共享的成员变量 添加一个vol
  • 详解卷积神经网络(CNN)在语音识别中的应用

    欢迎大家前往腾讯云社区 获取更多腾讯海量技术实践干货哦 作者 侯艺馨 前言 总结目前语音识别的发展现状 dnn rnn lstm和cnn算是语音识别中几个比较主流的方向 2012年 微软邓力和俞栋老师将前馈神经网络FFDNN Feed Fo
  • 面试经典数据库查询题目(学生、课程、选课)

    这是前几天一刚毕业的朋友的面试题 算是面试常遇到的sql经典题目 记录一下 如图 在此我在电脑数据库上建立了对应的表结构 以供检验sql语句正误 建表语句 学生表 student info CREATE TABLE student info
  • 解决过拟合现象的六种姿势

    前面一文讲述的了过拟合现象产生的原因 现在讲述过拟合现象如何解决 1 增加训练数据 这是解决过拟合现象的根本办法 若没有过多的训练数据 我们可以自己增加一些假数据来在增加数据的数量 从而让模型的泛化能力增强 2 控制模型的复杂度 过于复杂的
  • Linux搭建FTP服务器

    FTP文件传输协议 什么是FTP FTP相关信息 FTP工作流程 FTP与HTTP区别 FTP相关软件包 FTP默认配置信息 FTP相关状态码 部署FTPserver lftp客户端的一些命令 FTP具体配置 匿名用户相关配置 本地用户相关