Linux 下 FTP 连接使用方式及常用配置

2023-05-16

Linux 下 FTP 连接使用方式及常用配置

  • FTP 协议介绍
    • 传输方式
    • 支持模式
    • FTP 客户端注意事项
    • FTP 协议连接步骤
    • FTP 常用命令
  • Linux下 FTP 常用命令
    • Linux 下连接 FTP 服务器
    • Linux下 FTP 目录操作
    • Linux下 FTP 文件操作
    • 其它命令
  • FTP 错误码

FTP 协议介绍

FTP是FileTransferProtocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:“下载”(Download)和"上传"(Upload)。"下载"文件就是从远程主机拷贝文件至自己的计算机上;"上传"文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。

FTP 采用 Internet 标准文件传输协议 FTP 的用户界面, 向用户提供了一组用来管理计算机之间文件传输的应用程序。

FTP 是基于客户———服务器(C/S)模型而设计的,在客户端与 FTP 服务器之间建立两个连接。

开发任何基于 FTP 的客户端软件都必须遵循 FTP 的工作原理,FTP 的独特的优势同时也是与其它客户服务器程序最大的不同点就在于它在两台通信的主机之间使用了两条 TCP 连接,一条是数据连接,用于数据传送;另一条是控制连接,用于传送控制信息(命令和响应),这种将命令和数据分开传送的思想大大提高了 FTP 的效率,而其它客户服务器应用程序一般只有一条 TCP 连接。图 1 给出了 FTP 的基本模型。客户有三个构件:用户接口、客户控制进程和客户数据传送进程。服务器有两个构件:服务器控制进程和服务器数据传送进程。在整个交互的 FTP 会话中,控制连接始终是处于连接状态的,数据连接则在每一次文件传送时先打开后关闭。

传输方式

FTP的传输有两种方式:ASCII、二进制。

  • ASCII传输方式
    假定用户正在拷贝的文件包含的简单ASCII码文本,如果在远程机器上运行的不是UNIX,当文件传输时ftp通常会自动地调整文件的内容以便于把文件解释成另外那台计算机存储文本文件的格式。
    但是常常有这样的情况,用户正在传输的文件包含的不是文本文件,它们可能是程序,数据库,字处理文件或者压缩文件。在拷贝任何非文本文件之前,用binary 命令告诉ftp逐字拷贝。
  • 二进制传输模式
    在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位一一对应的。即使目的地机器上包含位序列的文件是没意义的。例如,macintosh以二进制方式传送可执行文件到Windows系统,在对方系统上,此文件不能执行。
    如在ASCII方式下传输二进制文件,即使不需要也仍会转译。这会损坏数据。(ASCII方式一般假设每一字符的第一有效位无意义,因为ASCII字符组合不使用它。如果传输二进制文件,所有的位都是重要的。)

支持模式

FTP客户端发起FTP会话,与FTP服务器建立相应的连接。FTP会话期间要建立控制信息进程与数据进程两个连接。控制连接不能完成传输数据的任务,只能用来传送FTP执行的内部命令以及命令的响应等控制信息;数据连接是服务器与客户端之间传输文件的连接,是全双工的,允许同时进行双向数据传输。当数据传输完成后,数据连接会撤消,再回到FTP会话状态,直到控制连接被撤消,并退出会话为止。

FTP支持两种模式:Standard (PORT方式,主动方式),Passive (PASV,被动方式)。

  • Port模式
    FTP 客户端首先和服务器的TCP 21端口建立连接,用来发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的TCP 20端口连接至客户端的指定端口发送数据。FTP server必须和客户端建立一个新的连接用来传送数据。

  • Passive模式
    建立控制通道和Standard模式类似,但建立连接后发送Pasv命令。服务器收到Pasv命令后,打开一个临时端口(端口号大于1023小于65535)并且通知客户端在这个端口上传送数据的请求,客户端连接FTP服务器此端口,然后FTP服务器将通过这个端口传送数据。
    很多防火墙在设置的时候都是不允许接受外部发起的连接的,所以许多位于防火墙后或内网的FTP服务器不支持PASV模式,因为客户端无法穿过防火墙打开FTP服务器的高端端口;而许多内网的客户端不能用PORT模式登陆FTP服务器,因为从服务器的TCP 20无法和内部网络的客户端建立一个新的连接,造成无法工作。

FTP 客户端注意事项

根据 FTP 客户端是否有公网 IP、是否安装防火墙以及连接的 FTP 服务器的搭建方式,需要注意以下事项:

  • 如果 FTP 客户端没有公网 IP,只能使用 PASV 方式才能连接 FTP 服务器;
  • 如果 FTP 客户端有公网 IP,且安装了防火墙,当使用 PORT 方式连接 FTP 服务器时,必须在防火墙上打开 1024 以上的高端端口,保证连接数据链路时,服务器端向客户端的连接请求不会被防火墙拦截

FTP 协议连接步骤

可以看这篇作者写的,十分详细:
https://blog.csdn.net/qq_37460687/article/details/125921156

FTP 常用命令

上传和下载。 21端口用于连接,20端口用于传输数据。

进行FTP文件传输中,客户端首先连接到FTP服务器的21端口,进行用户的认证,认证成功后,要传输文件时,服务器会开一个端口为20来进行传输数据文件。

Linux下 FTP 常用命令

Linux 下连接 FTP 服务器

  • 连接 FTP
# 格式:ftp [hostname | ip-address]
ftp 192.168.1.122
  • 断开FTP连接
quit

Linux下 FTP 目录操作

  • 查看当前目录
pwd
  • 进入指定目录
    # 格式:cd remote-directory
    cd
  • 创建目录
mkdir 目录名
  • 删除目录
rmdir 目录名
  • 查看当前目录下所有目录及文件
 # 格式:ls [remote-directory] [local-file]
 # 说明:remote-directory 指定要查看其列表的目录。如果没有指定将使用远程计算机中的当前工作目录。 local-file指要存储列表的本地文件,如果没有将输出将显示在屏幕上。
ls
  • 查看指定后缀文件
dir .jpg

Linux下 FTP 文件操作

  • 删除单个文件
    # 格式:delete remote-file
    delete 文件名
  • 删除多个文件
    # 格式:mdelete remote-files [ ...]
    mdelete 文件名
  • 重命名文件
    # 格式:rename filename newfilename
    rename test atest
  • 上传文件
    # 格式:put local-file [remote-file]
    put /home/a.txt /mydata/b.txt
  • 下载单个文件
    # 格式:get [remote-file] [local-file]
    get /mydata/a.txt /apps/b.txt
  • 下载多个文件
    # 进入指定目录
    cd /usr/your/

    # 格式:mget filename [filename ....]
    mget *.*

其它命令

  • 查询所有命令
# help[cmd]:显示FTP命令的帮助信息,cmd是命令名,如果不带参数,则显示所有FTP命令

FTP 错误码

描述讨论
100系列已请求的行动已启动; 期望另一个回复,然后继续一个新的命令。
110重新启动标记回复。文本是确切的,不留给特定的实现; 它必须读取“MARK yyyy = mmmm”,其中yyyy是用户进程数据流标记,以及mmmm服务器的等效标记(注意标记和“=”之间的空格)。
120服务准备在nn分钟。
125数据连接已打开; 转移开始。
150文件状态okay; 即将打开数据连接。FTP使用两个端口:21用于发送命令,20用于发送数据。状态代码150表示服务器将在端口20上打开一个新连接以发送某些数据。
200系列请求的操作已成功完成。
200命令okay。
202命令没有实现,在这个网站是多余的。
211系统状态或系统帮助答复。
212目录状态。
213文件状态。
214帮助消息。
215NAME系统类型。其中NAME是“指定号码”文档中列表中的官方系统名称。
220服务准备好为新用户。
221服务关闭控制连接。如果适当,请注销。
225数据连接打开; 没有转移正在进行。
226关闭数据连接。请求的文件操作成功(例如,文件传输或文件中止)。该命令在端口20上打开数据连接以执行操作,例如传输文件。此操作成功完成,并且数据连接关闭。
227进入被动模式。(h1,h2,h3,h4,p1,p2)
230用户登录,继续。在客户端发送正确的密码后,将显示此状态代码。它表示用户已成功登录。
250请求的文件操作okay,完成。
257已创建“PATHNAME”。
300系列该命令已被接受,但所请求的操作处于保持状态,等待接收进一步的信息。
331用户名okay,需要密码。在客户端发送用户名后,无论所提供的用户名是否是系统上的有效帐户,您都将看到此状态代码。
332需要帐户登录。提供登录凭据
350请求的文件操作等待进一步的信息。
400系列该命令未被接受并且请求的操作未发生,但错误条件是临时的,并且可以再次请求该操作。
421错误421服务不可用,关闭控制连接。错误421达到用户限制错误421您无权进行连接错误421已达到最大连接数错误421已超过最大连接数如果服务知道它必须关闭,这可以是对任何命令的回复。请稍后尝试登录。
425无法打开数据连接。从PASV更改为端口模式,检查您的防火墙设置,或尝试通过HTTP进行连接。
426连接关闭; 传输中止。该命令打开数据连接以执行操作,但该操作被取消,并且数据连接被关闭。尝试重新登录; 联系您的托管服务提供商,以检查是否需要增加您的托管帐户; 尝试禁用您的PC上的防火墙,看看是否解决了这个问题。如果没有,请与您的托管服务提供商或ISP联系。
450请求的文件操作未执行。文件不可用(例如,文件忙)。稍后再试。
451请求的操作中止:处理中的本地错误。确保命令和参数输入正确。
452请求的操作未执行。系统中存储空间不足。请FTP管理员增加分配的存储空间,或归档/删除远程文件。
500系列该命令未被接受,并且请求的操作未发生。
500语法错误,命令无法识别,命令行太长。尝试切换到被动模式。
501参数或参数中的语法错误。验证您的输入; 例如,确保没有错误的字符,空格等。
502命令未实现。服务器不支持此命令。
503错误的命令序列。验证命令序列。
504未对该参数实现命令。确保输入的参数正确。
530用户未登录。确保键入正确的用户名和密码组合。某些服务器在达到用户限制时使用此代码,而不是421
532需要存储文件的帐户。登录的用户没有在远程服务器上存储文件的权限。
550请求的操作未执行。文件不可用,找不到,无法访问验证您是否尝试连接到正确的服务器/位置。远程服务器的管理员必须为您提供通过FTP进行连接的权限。
552请求的文件操作中止。超过存储分配。需要更多的磁盘空间。存档远程服务器上不再需要的文件。
553请求的操作未执行。不允许文件名。更改文件名中的文件名或删除空格/特殊字符。
10,000系列常见Winsock错误代码(Winsock错误代码的完整列表)
10054连接由对等体复位。远程主机强制关闭连接。
10060无法连接到远程服务器。一般是超时错误。尝试从PASV切换到端口模式,或尝试增加超时值。
10061无法连接到远程服务器。服务器主动拒绝连接。尝试切换连接端口。
10066目录不为空。当其中有文件/文件夹时,服务器不会删除此目录。如果要删除目录,请首先归档或删除其中的文件。
10068用户过多,服务器已满。尝试在另一时间登录。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux 下 FTP 连接使用方式及常用配置 的相关文章

  • 为什么 Linux 原始套接字的 RX 环大小限制为 4GB?

    背景 我试图mmap 我的原始套接字的 RX 环形缓冲区64 bitLinux 应用程序 我的环由 4096 个块组成 每个块大小为 1MB 总共 4GB 请注意 每个 1MB 块中可以有许多帧 如果您好奇 请参阅此文档了解背景信息 htt
  • Jenkins - 如何将文件夹/文件从 Jenkins Linux 代理部署到 Windows 服务器?

    构建完成后 我将得到包含文件的构建文件夹 我需要将它们复制到远程 Windows 服务器 我尝试使用 通过 FTP 发布 插件但似乎 该插件可供采用 因此 根据公司政策 无法安装此功能 https plugins jenkins io pu
  • 我们真的应该使用 Chef 来管理 sudoers 文件吗?

    这是我的问题 我担心如果 Chef 破坏了 sudoers 文件中的某些内容 可能是 Chef 用户错误地使用了说明书 那么服务器将完全无法访问 我讨厌我们完全失去客户的生产服务器 因为我们弄乱了 sudoers 文件并且无法再通过 ssh
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • 就分页分段内存而言的程序寿命

    我对 x86 Linux 机器中的分段和分页过程有一个令人困惑的概念 如果有人能澄清从开始到结束所涉及的所有步骤 我们将很高兴 x86 使用分页分段内存技术进行内存管理 任何人都可以解释一下从可执行的 elf 格式文件从硬盘加载到主内存到它
  • 如何在linux中以编程方式获取dir的大小?

    我想通过 C 程序获取 linux 中特定目录的确切大小 我尝试使用 statfs path struct statfs 但它没有给出确切的大小 我也尝试过 stat 但它返回任何目录的大小为 4096 请建议我如何获取 dir 的确切大小
  • 如何根据标签将单个 XML 文件拆分为多个

    我有一个带有标签的 XML 文件 我想像这样分割文件
  • 使用包管理器时如何管理 Perl 模块?

    A 最近的问题 https stackoverflow com questions 397817 unable to find perl modules in intrepid ibex ubuntu这让我开始思考 在我尝试过的大多数 Li
  • .net-core:ILDASM / ILASM 的等效项

    net core 是否有相当于 ILDASM ILASM 的功能 具体来说 我正在寻找在 Linux 上运行的东西 因此为什么是 net core ildasm 和 ilasm 工具都是使用此存储库中的 CoreCLR 构建的 https
  • Bash - 在与当前终端分开的另一个终端中启动命令的新实例

    我有一个简单的 bash 脚本 test sh 设置如下 bin bash args if args 0 check capture then watch n 1 ls lag home user capture0 watch n 1 ls
  • 与 pthread 的进程间互斥

    我想使用一个互斥体 它将用于同步对两个不同进程共享的内存中驻留的某些变量的访问 我怎样才能做到这一点 执行该操作的代码示例将非常感激 以下示例演示了 Pthread 进程间互斥体的创建 使用和销毁 将示例推广到多个进程作为读者的练习 inc
  • 静态方法的 Java 内存模型

    我来自操作系统和 C 语言背景 在代码编译时 世界很简单 需要处理和理解堆栈 堆文本部分等 当我开始学习 Java 时 我确实了解 JVM 和垃圾收集器 我对静态方法感到很有趣 根据我的理解 类的所有实例都会在堆中创建 然后被清理 但是 对
  • 如何在 Linux 中使用 C 语言使用共享内存

    我的一个项目有点问题 我一直在试图找到一个有据可查的使用共享内存的例子fork 但没有成功 基本上情况是 当用户启动程序时 我需要在共享内存中存储两个值 当前路径这是一个char and a 文件名这也是char 根据命令参数 启动一个新进
  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工
  • 使用 python 脚本更改 shell 中的工作目录

    我想实现一个用户态命令 它将采用其参数之一 路径 并将目录更改为该目录 程序完成后 我希望 shell 位于该目录中 所以我想实施cd命令 但需要外部程序 可以在 python 脚本中完成还是我必须编写 bash 包装器 Example t
  • 绕过 dev/urandom|random 进行测试

    我想编写一个功能测试用例 用已知的随机数值来测试程序 我已经在单元测试期间用模拟对其进行了测试 但我也希望用于功能测试 当然不是全部 最简单的方法是什么 dev urandom仅覆盖一个进程 有没有办法做类似的事情chroot对于单个文件并
  • linux下如何从文本文件中获取值

    我有一些文本格式的文件 xxx conf 我在这个文件中有一些文本 disablelog 1 当我使用 grep r disablelog oscam conf 输出是 disablelog 1 但我只需要值1 请问你有什么想法吗 一种方法
  • 这种文件锁定方法可以接受吗?

    我们有 10 个 Linux 机器 每周必须运行 100 个不同的任务 这些计算机主要在我们晚上在家时执行这些任务 我的一位同事正在开发一个项目 通过使用 Python 自动启动任务来优化运行时间 他的程序将读取任务列表 抓取一个打开的任务
  • 尽管我已在 python ctypes 中设置了信号处理程序,但并未调用它

    我尝试过使用 sigaction 和 ctypes 设置信号处理程序 我知道它可以与python中的信号模块一起使用 但我想尝试学习 当我向该进程发送 SIGTERM 时 但它没有调用我设置的处理程序 只打印 终止 为什么它不调用处理程序
  • 无法显示 Laravel 欢迎页面

    我的服务器位于 DigitalOcean 云上 我正在使用 Ubuntu 和 Apache Web 服务器 我的家用计算机运行的是 Windows 7 我使用 putty 作为终端 遵循所有指示https laracasts com ser

随机推荐