TT Lab
开始
学习 学习路径 课程

SSH 与文件传输

用 scp 与 sftp 传文件

在 TT Lab 中继续学习

目标

用 scp 和 sftp 上传、下载文件,保留时间戳,并用校验和确认完整性。

为什么重要

传输“结束了”和“传对了”是两回事。在实际工作中,总是要用校验和来确认。此外,scp 的端口选项是大写的 -P,这一点看似微不足道,实际上却经常有人写错,因为 ssh 用小写指定端口。小写的 -p 表示保留时间戳,会悄悄地去做另一件事。sftp 批处理模式在与合作伙伴自动交换文件时,至今仍是标准用法。

在这个实验中,请把 127.0.0.1:2222 当作另一台服务器。直接使用上一个实验中创建的 /root/.ssh/id_labhub 密钥。

步骤

  1. 创建目录 /root/xfer/src,并在其中创建 a.txt(1KB 以上)、b.txt(1KB 以上)、c.bin(10KB 以上)三个文件。
  2. 创建远端的 /root/xfer/dst/ 目录,并把 a.txt 上传到那里。
  3. 把整个 /root/xfer/src 目录递归复制到远端的 /root/xfer/tree/ 之下。结果必须存在 /root/xfer/tree/src/b.txt。
  4. 把远端的 /root/xfer/dst/a.txt 下载到本地的 /root/xfer/back/。
  5. 在 /root/xfer/batch.txt 中写入 sftp 批处理命令并执行。批处理必须把 /root/xfer/src/c.bin 上传到远端的 /root/xfer/dst/。把执行日志保存到 /root/xfer/sftp.log。
  6. 把 b.txt 保留时间戳地复制到远端的 /root/xfer/dst/,并把源文件和副本的 mtime(精确到秒)各写一行,保存到 /root/xfer/mtime.txt。两个值必须相同。
  7. 为 /root/xfer/src 中的三个文件创建 sha256 清单,验证到达 /root/xfer/dst 和 /root/xfer/tree/src 的文件哈希是否一致,并把结果保存到 /root/xfer/verify.txt。
  8. 把 /root/xfer/notes.txt 写成下面这 3 行。 SCP_PORT_FLAG=-P / SSH_PORT_FLAG=-p / SCP_PRESERVE_FLAG=-p

参考

准备要传输的文件

创建目录 /root/xfer/src,并在其中创建 a.txt(1KB 以上)、b.txt(1KB 以上)、c.bin(10KB 以上)三个文件。

三个大小不同的文件就够了。可以用 head 或 dd 创建,也可以用 base64 填充。

上传文件

创建远端的 /root/xfer/dst/ 目录,并把 a.txt 上传到那里。

指定端口用的是大写选项。小写的含义完全不同,请注意。

整个目录一起上传

把整个 /root/xfer/src 目录递归复制到远端的 /root/xfer/tree/ 之下。结果必须存在 /root/xfer/tree/src/b.txt。

发送目录需要递归选项。如果目标路径不存在,请提前创建。

下载

把远端的 /root/xfer/dst/a.txt 下载到本地的 /root/xfer/back/。

远端路径写在前面,本地路径写在后面。远端的写法格式是 用户@主机:路径。

执行 sftp 批处理

在 /root/xfer/batch.txt 中写入 sftp 批处理命令并执行。批处理必须把 /root/xfer/src/c.bin 上传到远端的 /root/xfer/dst/。把执行日志保存到 /root/xfer/sftp.log。

sftp 有从文件中读取命令列表的选项。批处理文件中每行写一条命令。

保留时间戳

把 b.txt 保留时间戳地复制到远端的 /root/xfer/dst/,并把源文件和副本的 mtime(精确到秒)各写一行,保存到 /root/xfer/mtime.txt。两个值必须相同。

保留选项是小写的。请用 stat 比较 mtime 来确认。

验证完整性

为 /root/xfer/src 中的三个文件创建 sha256 清单,验证到达 /root/xfer/dst 和 /root/xfer/tree/src 的文件哈希是否一致,并把结果保存到 /root/xfer/verify.txt。

用 sha256sum 创建清单,再用 -c 检查。把路径调整到源文件和副本具有相同的名称,会比较方便。

选项整理笔记

把 /root/xfer/notes.txt 写成下面这 3 行。 SCP_PORT_FLAG=-P / SSH_PORT_FLAG=-p / SCP_PRESERVE_FLAG=-p

关键在于 scp 和 ssh 的端口选项大小写不同。值请用准确的字符来写。