写这个post的起因是主包试图从github上拉一个数据集到服务器,拷打gemini用git lfs结果频频失败,最后发现github上的数据集就是损坏的。决定来都来了,干脆学一下拉取文件的方法。(其实前后文并无关系)

Linux 服务器文件传输与拉取速查 (SCP, Wget, Git LFS)

1. SCP (Secure Copy) —— 局域网/远程传输

场景:本地电脑(Windows/Mac)已经下好了数据集,需要“推”送到服务器。
核心逻辑:基于 SSH 协议的加密传输。(Secure Shell,远程服务器用的一种传输/登录的协议;然后提供了一些基于这个安全隧道的工具比如scp、sftp方便像控制本地电脑一样控制远程服务器)

常用命令

1
2
3
4
5
6
7
8
9
# 1. 从本地上传到服务器 (在本地终端执行)
# -P 为端口号,注意是大写
scp -P [端口] "[本地路径]" [用户名]@[IP]:[服务器目标路径]

# 示例:将下载好的 zip 传到服务器指定目录
scp -P 22 "C:\Users\Lenovo\Downloads\data.zip" example@xx.xx.xx.xx:/home/folder/data

# 2. 从服务器下载到本地 (在本地终端执行)
scp -P [端口] [用户名]@[IP]:[服务器文件路径] "[本地保存路径]"

注意

  • 空格处理:如果路径中有空格,Windows 建议用双引号 "" 括起来;Linux 则需在空格前加反斜杠 \
  • 断网重传:SCP 不支持断点续传。如果文件巨大(>10GB),建议改用 rsync -P

既然你已经把 SSH 的协议本质和密码学逻辑盘清楚了,那在博客里加上 SFTP 这一节会显得你的技术视野非常完整。

SFTP 不仅仅是“另一个传输工具”,它是 “交互式、可断点续传、更现代” 的文件管理标准。以下是为你更新后的 Markdown 源码,我把 SFTP 放在了 SCP 之后,并同步更新了最后的总结表格。

Markdown

title: 服务器文件传输指令速查
date: 2026-03-25 18:20:00
tags: [Linux, SSH, SCP, SFTP, Git-LFS]

写这个 post 的起因是试图从 GitHub 上拉一个数据集到服务器,拷打 Gemini 用 Git LFS 结果频频失败,最后发现 GitHub 上的数据集指针是损坏的。决定来都来了,干脆学一下拉取文件的方法。(其实前后文并无关系)

Linux 服务器文件传输与拉取速查 (SCP, SFTP, Wget, Git LFS)

1. SCP (Secure Copy) —— 极简远程拷贝

场景:本地电脑(Windows/Mac)已经下好了数据集,需要快速“推”送到服务器。
核心逻辑:基于 SSH 协议。SSH 是远程服务器的一种加密通信协议,它建立了一条安全隧道,而 SCP 就是在这个隧道里跑的“货车”。

常用命令

1
2
3
4
5
6
7
8
9
# 1. 从本地上传到服务器 (在本地终端执行)
# -P 为端口号,注意是大写
scp -P [端口] "[本地路径]" [用户名]@[IP]:[服务器目标路径]

# 示例:将下载好的 zip 传到服务器
scp -P 22 "C:\Downloads\data.zip" user@xx.xx.xx.xx:/home/user/data/

# 2. 从服务器下载到本地
scp -P [端口] [用户名]@[IP]:[服务器路径] "[本地路径]"

注意

  • 无断点续传:如果传到 99% 断网了,SCP 必须重头再来。
  • 空格处理:Windows 路径建议用双引号 "" 括起来。

2. SFTP (SSH File Transfer Protocol) —— 交互式文件管理

场景:需要频繁查看服务器目录、删除文件、或者在不稳定的网络下传输超大数据。
核心逻辑:同样基于 SSH,但它是一个独立的子协议。相比 SCP 的“一锤子买卖”,它更像是一个“在线网盘”。

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 1. 建立连接 (在本地终端执行)
sftp -P [端口] [用户名]@[IP]

# 2. 常用交互指令 (连接成功后进入 sftp 提示符)
ls # 查看服务器文件
lpwd # 查看本地当前路径
put [本地文件] # 上传文件
get [远程文件] # 下载文件
exit # 退出连接

# 一个例子
# 1. 连上服务器
sftp -P 22 user@xx.xxx.xx.xx

# 2. 定位远程目录 (Remote CD)
# 进入你想存文件的那个服务器文件夹
cd /home/dataset/charts/

# 3. 定位本地目录 (Local CD)
# 告诉 sftp 现在去你本地的哪个文件夹找东西
lcd "C:/Users/Lenovo/Desktop/my_data"

# 4. 执行上传
# 此时 put 后面直接写文件名即可,它会自动从 lcd 指定的目录抓取
put 1.png

# 如果想传整个文件夹下的所有文件:
put -r .

注意

  • 断点续传:SFTP 支持 reputreget,断网后可以接着传。
  • GUI 友好:FileZilla、WinSCP 甚至 VS Code 的同步插件,底层走的都是 SFTP。

3. Wget —— 网页文件收割机

场景:在 GitHub、论文官网或 Google Drive 看到直链,想直接在服务器上“拉”下来。
核心逻辑:非交互式命令行下载工具,支持 HTTP/HTTPS/FTP。

常用命令

1
2
3
4
5
6
7
8
# 1. 基础下载
wget [URL]

# 2. 指定保存名称 (防止 URL 太长导致文件名乱码)
wget "[URL]" -O my_dataset.zip

# 3. 断点续传 (下载大文件必带,防止网络波动)
wget -c "[URL]"

注意

  • 404 错误:如果链接指向的是 GitHub 私有仓库或 LFS 文件,直接 wget 会报 404。此时需要手动下载到本地再用 SCP 传。
  • 双引号:如果 URL 里包含 &? 等特殊符号,一定要用双引号把 URL 包起来。

4. Git LFS (Large File Storage) —— 优雅的“占位符”管理

场景:GitHub 上的数据集、模型权重(.pth/.bin)。如果你 clone 下来发现文件只有 1KB,那它就是 LFS 指针。
核心逻辑:Git 只存指针(Text),真正的大文件(Binary)存在后端存储服务器。

常用命令

1
2
3
4
5
6
7
8
9
# 1. 初始化 (每台新服务器只需执行一次)
git lfs install

# 2. 拉取当前仓库所有大文件 (在仓库根目录执行)
git lfs pull

# 3. 针对性拉取 (当只想下载某一个大文件夹时,配合 Sparse Checkout 使用)
git lfs fetch --all
git lfs checkout

注意

  • 网络阻断:国内访问 LFS 的 AWS 存储节点极慢。如果 git lfs pull 没反应,最快的方法是:浏览器手动下载 -> SCP 上传。

📊 总结与对比

工具 协议底层 核心优势 缺点 推荐指数
SCP SSH (RCP) 速度快、指令简单 不支持续传、功能单一 ⭐⭐⭐⭐⭐
SFTP SSH (SFTP) 支持续传、可交互管理 协议开销略大于 SCP ⭐⭐⭐⭐⭐
Wget HTTP/S 直接拉取公网资源 无法处理复杂鉴权 ⭐⭐⭐⭐
Git LFS Git 自研 解决 Git 存不动大文件的问题 极其依赖网络环境 ⭐⭐⭐