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

  1. 检查系统中是否安装了ftp软件

    #which vsftpd
    
  2. 如果没有安装,安装之

    #yum install vsftpd
    
  3. 查看ftp服务器状态

    #service vsftpd status
    
  4. 启动ftp服务器

    #service vsftpd start
    

    另外service命令还支持其它的一些基本LSB操作包括:stop,restart,try-restart,reload,force-reload,status,若需要更多的操作,则需要用systemctl来执行.

  5. 查看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服务已经开启

  6. 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服务
    
  7. 登录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命令汇总

    或者参照ftp手册.

常用的SFTP命令

SFTP的命令和FTP基本一致,只有些许的区别,比如:

  • sftp可以直接用sftp [username@]IPaddress 的方式来登录,ftp不行
  • sftp在命令前加l来表示是对本地主机进行操作,ftp是加!,且ftp中的lcd比较特殊,不过sftp是兼容ftp!的用法的
  • 删除本地文件不能用lrm,而只能用!rm(我也不知道为什么要这样设计)
  • sftp可以直接通过加-r选项的方式来下载或者上传文件夹,ftp则不行

参考

匿名FTP-百度百科

FTP基础知识

常用FTP命令汇总

posted @ 2022-10-23 00:18  yukina~  阅读(167)  评论(0编辑  收藏  举报