如何在 telnet 中计量 FTP 上传进度

如何在 telnet 中计量 FTP 上传进度

我正在编写一个脚本,用于telnet连接到 ftp 服务器并在其上放置一个大文件。

由于项目环境的原因,我需要使用ftp,不能依赖其他技术,比如scprsync什么的。

我怎样才能知道我的上传进度?

pureftp我可以在和之间切换服务器端proftpd

我试图分析我写入传输通道的进度,但这似乎是错误的,因为它显示在文件到​​达服务器之前很久就完成了。所以我想得到一些服务器端的反馈。我希望找到一些神奇的 STOR 命令,提供有关实际写入的数据量的反馈。

我在 proftpd 上找到了 STAT 命令,但它看起来很滞后,需要请求。

有没有一种简单的方法可以实现这一进步?

客户端 ftp 的传统 HASH 反馈是如何工作的?

答案1

您所观察到的行为之所以发生,是因为即使客户端已将数据写入 FTP 数据连接的套接字,并且客户端的内核已回复此操作成功发生(通过从write()send()系统调用成功返回),数据仍然处于所有类型缓冲区且尚未提交到目标文件。它在源操作系统的网络缓冲区中,在以太网卡的缓冲区中,在线路上传输,在目的地的缓冲区中,在 FTP 服务器进程的缓冲区中,它已被写入服务器上的文件但尚未写入刷新到磁盘等...

这不仅仅发生在 FTP 上。您也可以使用更现代的文件传输工具轻松注意到这种情况的发生scpscp一个文件跨越半个地球(对于高延迟网络)或存储速度较慢的系统,您会看到传输进度显示的比实际速度快,然后它似乎挂在 100% 完成状态一段时间在命令实际完成之前。

如果您查看 netkit-ftp(Debian 上的默认/标准 FTP 客户端)的源代码,您会发现它的 # 标记处理并没有做任何特殊的事情。它根据已写入数据连接套接字的数据量来写入哈希标记。因此,它将要表现出与您所观察到的相同的行为。

普通 FTP 客户端所做的以及您也应该做的就是等待STOR控制连接上命令的回复。该回复将在您刷新并关闭数据连接套接字后一段时间出现。当您收到回复时,您就知道 FTP 服务器拥有数据。它可能没有完全提交到磁盘,但这已经是您将得到的确认信息了。

答案2

如果您的客户端/服务器没有显示进度 - 您可以根据文件读取的进度在客户端检查上传进度。

  1. 你有上传文件的大小
  2. 您知道上传文件的 pid 进程(例如 1234)。
  3. 您可以查看 /proc/1234/fd - 哪个 fd 属于读取的文件(例如 5)。
  4. 然后 - 你可以查看 /proc/1234/fdinfo/5 - 你在这里看到类似的东西
邮政编码:12313
标志:0100002

这意味着,该文件中的位置是 12313 - 因此 - 如果您将位置 (12313) 除以文件大小 - 您将获得整体进度。

相关内容