乐于分享
好东西不私藏

【数据产品】利用 SFTP 批量下载 CloudSat 数据

【数据产品】利用 SFTP 批量下载 CloudSat 数据

CloudSat 是一颗用于全球云观测的卫星,其搭载的云剖面雷达(Cloud Profiling Radar,CPR)能够提供云层垂直结构、云分类和降水等信息。

最近利用Downthemall插件批量下载时遇服务器超时问题,所以转用SFTP方法进行下载,故写此文。

本文以 Windows PowerShell 为例,介绍如何使用 SFTP 登录 CloudSat 数据服务器,并以 2B-CLDCLASS-LIDAR.P1_R05 和 ECMWF-AUX.P_R05 为例,说明单日测试、批量下载、断点续传和结果检查的完整流程。

一、下载前的准备

1. 注册 CloudSat 账号

首先需要在 CloudSat 数据网站注册账号。后续登录 SFTP 服务器时,会使用注册邮箱转换后的用户名。

2. 查询当前公网 IPv4

在 PowerShell 中运行:

1
curl.exe -4 https://checkip.amazonaws.com

也可以使用其他 IPv4 查询服务:

1
2
curl.exe -4 https://icanhazip.comcurl.exe -4 https://api.ipify.org

CloudSat 的 SFTP 访问与登记的公网 IPv4 有关。因此,填写 SFTP Key 信息时登记的 IP,必须与实际下载时的网络出口 IP 一致。

如果切换了 VPN、校园网、家庭宽带或手机热点,公网 IPv4 可能随之变化。此时需要重新查询 IP,并在 CloudSat 页面更新登记信息。

3. 生成 SSH 密钥

如果电脑中还没有 SSH key,可在 PowerShell 中运行:

1
ssh-keygen -t ed25519

按提示完成创建后,查看公钥:

1
Get-Content $HOME\.ssh\id_ed25519.pub

将输出的整行公钥复制到 CloudSat 网站的 Add SFTP Key 页面,同时填写刚才查询到的公网 IPv4。

.pub 结尾的文件是公钥,可以提交给服务器;id_ed25519 是私钥,必须妥善保管,不要上传或发送给他人。

二、测试 SFTP 登录

CloudSat 的 SFTP 用户名由注册邮箱转换而来:将邮箱中的 @ 替换为 AT

例如,注册邮箱为:

1
yourname@example.com

对应的 SFTP 用户名为:

1
yournameATexample.com

登录命令为:

1
sftp yournameATexample.com@www.cloudsat.cira.colostate.edu

首次连接时,系统会询问是否信任服务器指纹:

1
Are you sure you want to continue connecting (yes/no/[fingerprint])?

确认主机信息无误后输入 yes。如果终端出现 sftp> 提示符,说明已经成功进入 CloudSat 服务器。

可以用以下命令检查目录:

1
2
3
4
pwdlscd Datals

这里需要区分两类命令:

  • cd 用于切换远程服务器目录;
  • lcd 用于切换本地下载目录。

输入 bye 可退出 SFTP。

三、确认数据产品与版本

本文以云分类产品为例,主产品为:

1
2B-CLDCLASS-LIDAR.P1_R05

该产品结合 CloudSat 与 CALIPSO 观测,可提供云分类、云相态、云层顶底高度等信息。如果后续分析还需要温度场,应下载:

1
ECMWF-AUX.P_R05

CloudSat 目录中同时存在 ECMWF-AUX.P1_R05,但该版本是为 2B-FLXHR-LIDAR.P2_R05 制作的输入数据。当主产品使用 2B-CLDCLASS-LIDAR.P1_R05 时,选择 ECMWF-AUX.P_R05 能够与原产品生产链保持一致。

四、先测试下载一天数据

批量下载前,建议先用一天的数据检查账号权限、远程路径和本地路径是否正确。

首先在 PowerShell 中创建本地目录:

1
2
New-Item -ItemType Directory -Force "E:\CloudSat\2B-CLDCLASS-LIDAR"New-Item -ItemType Directory -Force "E:\CloudSat\ECMWF-AUX"

New-Item 是 PowerShell 命令,不能在 sftp> 提示符下运行。

以 2019 年 2 月 19 日为例,该日是当年第 50 天,即年积日(Day of Year,DOY)050。登录 SFTP 后运行:

1
2
3
4
lcd E:/CloudSat/2B-CLDCLASS-LIDARcd /Data/2B-CLDCLASS-LIDAR.P1_R05/2019/050lsmget *

Windows 本地路径在 SFTP 中建议使用正斜杠 /

下载 ECMWF-AUX 数据的方法同上。

五、批量下载指定日期范围

当需要下载连续数月的数据时,逐日手动进入目录效率很低。OpenSSH SFTP 支持通过 -b 选项读取批处理文件,因此可以用 PowerShell 自动生成下载指令。

以 2019 年 2 月 19 日至 6 月 20 日为例,对应的 DOY 范围为 050-171

1. 批量下载 2B-CLDCLASS-LIDAR

在 PowerShell 中运行:

1
2
3
4
5
6
7
$batch = @('lcd E:/CloudSat/2B-CLDCLASS-LIDAR')50..171 | ForEach-Object {    $doy = $_.ToString('000')doy/*"}$batch += 'bye'HOME\cloudsat_cldclass_lidar_2019.txt" -Encoding ascii

然后执行:

1
sftp -b "$HOME\cloudsat_cldclass_lidar_2019.txt" yournameATexample.com@www.cloudsat.cira.colostate.edu

2. 批量下载 ECMWF-AUX

生成第二个批处理文件:

1
2
3
4
5
6
7
$batch = @('lcd E:/CloudSat/ECMWF-AUX')50..171 | ForEach-Object {    $doy = $_.ToString('000')doy/*"}$batch += 'bye'HOME\cloudsat_ecmwf_2019.txt" -Encoding ascii

开始下载:

1
sftp -b "$HOME\cloudsat_ecmwf_2019.txt" yournameATexample.com@www.cloudsat.cira.colostate.edu

上述脚本中有两个关键细节:

  • get -a 使用断点续传模式,重新执行批处理文件时,可继续下载未完成的文件;
  • 命令前的 - 表示某条指令失败后仍继续执行,避免因某个 DOY 目录不存在而中断整个任务。

因此,-get -a 很适合用于 CloudSat 这类可能存在缺日、缺轨或网络中断的长时间序列下载任务。

六、检查下载结果

下载结束后,可以在 PowerShell 中统计文件数量和总大小:

1
2
3
4
5
Get-ChildItem "E:\CloudSat\2B-CLDCLASS-LIDAR" -File |    Measure-Object -Property Length -SumGet-ChildItem "E:\CloudSat\ECMWF-AUX" -File |    Measure-Object -Property Length -Sum

两种产品通常共享相同的时间戳和轨道号。例如:

1
2019050022421_68243

对应的两个文件可能为:

1
2
2019050022421_68243_CS_2B-CLDCLASS-LIDAR_GRANULE_P1_R05_E08_F03._hdf_2019050022421_68243_CS_ECMWF-AUX_GRANULE_P_R05_E08_F03.hdf

查询某个轨道文件是否存在:

1
2
3
4
5
Get-ChildItem "E:\CloudSat\2B-CLDCLASS-LIDAR" -File |    Where-Object Name -Like "2019050022421_68243*"Get-ChildItem "E:\CloudSat\ECMWF-AUX" -File |    Where-Object Name -Like "2019050022421_68243*"

后续进行云相态、云顶温度等联合分析时,建议按时间戳和轨道号对两类产品取交集,只处理配对成功的 granule。

七、常见问题与解决方法

1. SSH 配置文件报错

如果出现:

1
C:\Users\...\.ssh/config line 4: no argument after keyword "port"

说明 $HOME\.ssh\config 中存在缺少参数的 Port 配置。打开文件:

1
notepad "$HOME\.ssh\config"

删除空的 Port 行,或将其改为:

1
Port 22

也可以在当次连接中临时忽略本地 SSH 配置文件:

1
sftp -F NUL yournameATexample.com@www.cloudsat.cira.colostate.edu

2. 22 端口连接超时

如果出现:

1
ssh: connect to host www.cloudsat.cira.colostate.edu port 22: Connection timed out

先检查当前网络能否访问 22 端口:

1
Test-NetConnection www.cloudsat.cira.colostate.edu -Port 22

如果返回 TcpTestSucceeded : False,可按以下顺序排查:

  1. 重新查询公网 IPv4,确认与 CloudSat 登记的 IP 一致;
  2. 暂停 VPN 或代理,检查出口 IP 是否改变;
  3. 检查校园网或单位网络是否限制出站 TCP 22 端口;
  4. 切换手机热点或其他网络后,更新登记 IP 再次测试。

3. 某些日期提示目录不存在

批量下载时可能看到:

1
stat remote: No such file or directory

这不一定是脚本错误,也可能是当天没有对应的远程数据目录。只要使用了带前缀 - 的下载指令,后续日期仍会继续执行。建议保留终端日志,便于后续核查缺失日期和轨道。

4. 提示文件未修改

如果使用 get -a 时出现:

1
File "...hdf" was not modified

通常说明本地已经存在完整文件,无需重复下载。