FTP
FTP
FTP基础知识
什么是FTP
- FTP(File Transfer Proitocol) 是文件传输协议,使用TCP来进行传输
- 基于不同的操作系统有不同的FTP应用程序,但所有这些应用程序都遵循同一种协议来传输文件.
- FTP中的两个基本概念: 上传和下载
- "下载"文件就是从远程主机拷贝文件到本地主机上,而"上传"则是将本地主机中的文件拷贝到远程主机
FTP的运行机制
-
FTP是一个C/S(Client/Server) 架构的网络服务
-
FTP 的运行顺序
- 用户通过一个支持FTP协议的客户机程序,连接到远程主机上的FTP服务器程序.
- 用户通过客户机程序向服务器程序发出命令,服务器程序执行用户所发出的命令,并将执行的结果返回到客户机
- 客户机程序代表用户收到这个文件,将其存放在用户目录中
-
FTP会话属于复合TCP连接,主动模式中开放20和21端口
- 控制连接: TCP port-21,负责发送FTP的命令信息(比如登录的指令,用户名和密码等)
- 数据连接: TCP port-20,负责上传/下载数据
-
FTP的连接模式和传输模式
- 连接模式分为主动模式和被动模式
- 传输模式分为ASCII模式(文本模式)和Binary模式(二进制模式)
-
主动模式和被动模式
连接模式中的主动和被动是站在服务器端的视角来说的
-
主动模式(Standard, PORT)
- 主动模式的工作顺序
- Client先和Server通过21端口建立连接
- Client向Server发送指令,指令中包含了Client要通过N号端口来传输什么数据
- Server打开自己的20端口,去主动连接Client的N好端口来传输数据
- 缺点
- 主动FTP对于FTP服务器的管理有利,但是对于客户端的管理不利
- 因为FTP服务器企图与客户端的高位随机端口建立连接,而这个端口很有可能会被客户端的防火墙阻塞掉
- 主动模式的工作顺序
-
被动模式(Passive, PASV)
为了解决服务器发起到客户端的连接的问题,人们开发了一种不同的FTP连接方式,只有当客户端通知服务器它处于被动模式时才会被启用,默认还是使用主动模式
- 被动模式的工作顺序
- Client先和Server通过21端口建立连接
- 建立连接后,与主动方式不同,Client不会提交PORT命令并允许Server来回连它的数据端口,而是提交PASV命令.
- Server会开启一个任意的非特权端口 P (P > 1024), 并发送 PORT P命令给Client
- Client发起从本地端口到Server端口 P 的连接用来传输数据.
- 缺点
- 被动FTP对客户端的管理有利而对服务器端的管理不利
- 因为客户端要与服务器端建立两个连接,其中一个连到大于1024的随机端口,而这个端口很有可能被服务器端的防火墙阻塞掉
- 被动模式的工作顺序
-
FTP的用户类型
- 匿名用户
- 匿名FTP的产生是因为Internet上的主机数量众多,不可能要求用户在每一台主机上都拥有账号,为了便于用户下载文件从而诞生了匿名FTP服务.
- 匿名FTP用户使用特殊的用户名"anonymous",实质上就是一个可以访问公开目录的公共账户,许多系统要求用户将E-mail地址作为口令,便可登录匿名FTP服务器,访问远程主机上公开的文件,匿名FTP一直是Internet上获取信息资源的最主要方式.
- 作为一种安全措施,大多数匿名FTP主机都允许用户从其下载文件,而不允许用户向其上传文件.
- 并不是所有服务器都支持匿名登录,它只适用于提供了这项服务的服务器.
- 本地(真实)用户
- 是FTP服务器本机的系统用户账号
- 当这类用户登录FTP服务器时,其默认的主目录为家目录
- 有些服务器会对本地账户做chroot(禁锢家目录)的操作来保证安全
- 虚拟用户
- 账号信息存放在独立的文件或者数据库内
- 不是本地账号,不能登录操作系统,安全性比较高
- 虚拟用户的特点:
- 只能访问服务器为其提供的FTP服务,而不能访问系统的其它资源
- 一般用于需要对用户开放写权限(可以上传数据到服务器),但又不想让其访问其它系统资源的情况.
Linux如何开启FTP服务
以常用的CentOS7为例:
Server
-
检查系统中是否安装了ftp软件
#which vsftpd
-
如果没有安装,安装之
#yum install vsftpd
-
查看ftp服务器状态
#service vsftpd status
-
启动ftp服务器
#service vsftpd start
另外service命令还支持其它的一些基本LSB操作包括:stop,restart,try-restart,reload,force-reload,status,若需要更多的操作,则需要用systemctl来执行.
-
查看ftp服务有没有启动
#service vsftpd status
若显示status为active(running)说明已经启动
或者
#netstat -an | grep 21
若显示
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN
或者
tcp 0 0 :::21 :::* LISTEN
则说明ftp服务已经开启
-
root登录ftp
一般来讲,root用户默认是不能登录ftp的.如果user用root登录,则会显示
530 Permission denied
,若要令root用户也可以登录ftp,则需要修改以下两个文件:#vim /etc/vsftpd/ftpusers //注释掉root #vim /etc/vsftpd/user_list //注释掉root #service vsftpd restart //重启ftp服务
-
登录ftp服务器
完成以上的步骤,就可以开始登录ftp服务器了,打开任意一个终端,windows自带的cmd或者powershell就可以.
Linux或Windows:
PS C:/Users/test01>ftp ftp> open 192.167.253.1 连接到 192.167.253.1 220(vsFTPd 3.0.3) 200 Always in UTF8 mode 用户(192.167.253.1:(none)): a 331 Please specify the password. 密码: 230 Login successful. ftp>
或者直接
ftp ipaddress
,会直接跳转到询问用户名和密码哪一步.
Client
当你准备好了一台FTP服务器,那么理所当然地就需要从客户端登录到FTP服务器上,但是有时候当你输入ftp
命令之后,却会显示ftp: command not found
的错误信息,原因很简单,就是因为ftp应用程序在系统中并没有安装.这听起来很蠢但事实上很多Linux的发行版都是没有默认安装ftp的,需要自己安装.可以用软件包管理器进行快捷安装,也可以自行用源码包进行安装.
yum install ftp //CentOS,Fedora,RHEL
apt install ftp //Debain,Ubuntu
然后就可以快乐地使用ftp命令了
SFTP
SFTP(英文全称: Secure File Transfer Portocol, 中文: 安全文件传送协议),是一种能够提供安全的网络加密的文件传输方法.SFTP和FTP有着几乎一样的语法和功能,但是SFTP是SSH中的一部分,本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认为22)来完成相应的连接和答复操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序.由于SFTP使用加密传输认证信息和传输的数据,因此SFTP非常安全,但由于中间多出了加密/解密的步骤,因此传输效率要比普通的FTP低得多.在对安全性要求较高时,可以选择用SFTP来代替FTP.
-
用法
用法和FTP基本一致,但有一些小的出入,将在后文说明
-
能力
和早期的scp协定相比较,scp只允许文件传输,而SFTP有更多元的操作,包括断点续传,查看目录列表等
常用的FTP命令汇总
ftp ipaddress //登录ftp
ls或者dir //显示远程主机目录
cd remote-dir //更改远程主机目录
lcd local-dir //更改本地主机目录
!ls或者!dir //显示本地在户籍目录
get remote-file [local-file] //将远程的remote-file下载到本地并重命名为local-file
put local-file [remote-file] //将本地的local-file上传到远端并重命名为remote-file
mget remote-file1 remote-file2 //下载多个远程文件
mput local-file1 local-file2 //上传多个本地文件
mkdir dir-name //在远程主机上创建目录
pwd //查看当前工作目录
passive //进入被动传输模式
promot //设置多个文件传输时的交互模式
close //中断与远程服务器的ftp会话,与open对应
quit或bye或exit //退出ftp会话
需要注意的有以下几点:
-
许多命令如ls,rm,mkdir等在前面加了!表示操作本地主机,否则为远程主机
-
ftp中很多命令是循环开关式的,如bell,prompt,每次输入会在on 和 off 的状态之间来回切换
-
很可惜,ftp并不能传输文件夹,只能传输单个文件,因此可行的方法为将文件夹打包或者配合wget来下载文件夹,当然更简单的办法可以直接用sftp
-
当我们用mget来下载多个文件时,每个文件都会弹出提示,想要关闭提示可以输入
prompt
来关闭提示 -
谨慎删除远程主机的文件
-
文中只列出比较常用的一小部分命令,更多命令介绍参见
或者参照ftp手册.
常用的SFTP命令
SFTP的命令和FTP基本一致,只有些许的区别,比如:
- sftp可以直接用
sftp [username@]IPaddress
的方式来登录,ftp不行 - sftp在命令前加l来表示是对本地主机进行操作,ftp是加!,且ftp中的lcd比较特殊,不过sftp是兼容ftp!的用法的
- 删除本地文件不能用lrm,而只能用!rm(我也不知道为什么要这样设计)
- sftp可以直接通过加-r选项的方式来下载或者上传文件夹,ftp则不行