用 scp 与 sftp 传文件
目标
用 scp 和 sftp 上传、下载文件,保留时间戳,并用校验和确认完整性。
为什么重要
传输“结束了”和“传对了”是两回事。在实际工作中,总是要用校验和来确认。此外,scp 的端口选项是大写的 -P,这一点看似微不足道,实际上却经常有人写错,因为 ssh 用小写指定端口。小写的 -p 表示保留时间戳,会悄悄地去做另一件事。sftp 批处理模式在与合作伙伴自动交换文件时,至今仍是标准用法。
在这个实验中,请把 127.0.0.1:2222 当作另一台服务器。直接使用上一个实验中创建的 /root/.ssh/id_labhub 密钥。
步骤
- 创建目录
/root/xfer/src,并在其中创建a.txt(1KB 以上)、b.txt(1KB 以上)、c.bin(10KB 以上)三个文件。 - 创建远端的
/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/。 - 在
/root/xfer/batch.txt中写入 sftp 批处理命令并执行。批处理必须把/root/xfer/src/c.bin上传到远端的/root/xfer/dst/。把执行日志保存到/root/xfer/sftp.log。 - 把
b.txt保留时间戳地复制到远端的/root/xfer/dst/,并把源文件和副本的 mtime(精确到秒)各写一行,保存到/root/xfer/mtime.txt。两个值必须相同。 - 为
/root/xfer/src中的三个文件创建 sha256 清单,验证到达/root/xfer/dst和/root/xfer/tree/src的文件哈希是否一致,并把结果保存到/root/xfer/verify.txt。 - 把
/root/xfer/notes.txt写成下面这 3 行。SCP_PORT_FLAG=-P/SSH_PORT_FLAG=-p/SCP_PRESERVE_FLAG=-p
参考
- 形式是
scp -P 2222 -i /root/.ssh/id_labhub <원본> root@127.0.0.1:<대상>(占位符依次为源路径、目标路径)。 - 要在远端创建目录,像
ssh lab2 mkdir -p /root/xfer/dst这样在远端执行命令即可。 - sftp 批处理文件的示例是
cd /root/xfer/dst,下一行是put /root/xfer/src/c.bin。 - 常见错误 1:在第 2 步使用小写的
-p,导致端口变成 22。连接本身就会失败。 - 常见错误 2:在第 3 步,目标路径末尾有没有斜杠会使目录深度不同。请确认所要求的最终路径。
准备要传输的文件
创建目录 /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 的端口选项大小写不同。值请用准确的字符来写。