在远程服务器上打包文件,然后下载到本地
这是最常见的需求,你想在远程服务器上把一个目录或文件打包成一个压缩包,然后通过 SSH 安全地下载到自己的电脑上。

方法1:两步走(先打包,再下载)
这是最直观的方法,适合初学者。
步骤1:在远程服务器上打包文件
登录到服务器,使用 tar 命令打包。tar 是 Linux/Unix 系统下最常用的归档工具。
# ssh user@remote_server_ip # 登录后执行以下命令 # 示例1:打包一个名为 my_project 的目录 tar -czf project_backup.tar.gz my_project/ # 示例2:打包多个文件和目录 tar -czf all_backups.tar.gz /var/log/nginx/ /home/user/config.conf # 命令解释: # -c: 创建一个新的归档文件 # -z: 使用 gzip 进行压缩(生成 .gz 文件) # -f: 指定归档文件的名称
步骤2:下载打包好的文件

使用 scp (Secure Copy) 命令通过 SSH 通道下载文件。
# 在你的本地终端执行 scp user@remote_server_ip:/path/to/project_backup.tar.gz ./ # 命令解释: # user: 远程服务器用户名 # remote_server_ip: 远程服务器 IP 地址或域名 # /path/to/project_backup.tar.gz: 远程服务器上打包文件的完整路径 # ./: 下载到当前本地目录
方法2:一步走(使用管道 和 tar 的远程功能)
这种方法更高效,因为它不需要在远程服务器上创建临时的 .tar.gz 文件,而是直接将压缩数据流传输到本地。
# 在你的本地终端执行 ssh user@remote_server_ip "tar -czf - /path/to/my_project" > project_backup.tar.gz # 命令解释: # ssh user@remote_server_ip: 连接到远程服务器 # "tar -czf - /path/to/my_project": 这是在远程服务器上执行的命令 # -c: 创建归档 # -z: 使用 gzip 压缩 # -f -: 这里的 "-" 是关键!它告诉 tar 将输出写入到标准输出,而不是一个文件。 # > project_backup.tar.gz: 这是本地的 shell 操作,它接收来自 SSH 的标准输出,并将其重定向到一个本地文件。
这个命令的流程是:
- 本地终端通过 SSH 连接到远程服务器。
- 远程服务器执行
tar命令,但不是把结果存成一个文件,而是通过标准输出“吐”出来。 - SSH 连接将这个“数据流”安全地传回本地。
- 本地的
>操作符将这个数据流写入到project_backup.tar.gz文件中。
优点:

- 高效:无需在远程服务器上创建和删除临时文件,节省磁盘 I/O。
- 简洁:一条命令完成,无需两次登录。
在本地打包文件,然后上传到远程服务器
这个场景相对简单,直接使用 scp 即可。
# 在你的本地终端执行 scp local_files.tar.gz user@remote_server_ip:/path/on/remote/server/ # 命令解释: # local_files.tar.gz: 本地已打包好的文件 # user@remote_server_ip:/path/on/remote/server/: 远程服务器的目标路径
更高级的用法(rsync)
如果你需要同步一个目录,而不仅仅是打包一次,rsync 是比 scp 更强大的工具,它只传输变化的文件,非常高效。
使用 rsync 打包并传输(类似 scp)
# 在本地终端执行 # 将本地目录同步到远程服务器的一个压缩包 # 注意:这种方式会在远程服务器上创建一个压缩包,而不是打包后传输。 # 如果你想要“打包传输流”,需要结合管道,比较复杂,通常不这样做。 # 更常见的用法是直接同步目录内容 rsync -avz -e ssh /path/to/local/dir/ user@remote_server_ip:/path/to/remote/dir/ # 如果确实需要先打包再同步,可以用方法一 tar -czf - /path/to/local/dir | ssh user@remote_server_ip "cat > /path/on/remote/server/backup.tar.gz"
使用 rsync 增量备份
rsync 的真正威力在于增量备份,它只传输自上次同步以来有变化的文件。
# 在本地终端执行 # -a: 归档模式,保留权限、时间戳等 # -v: 详细模式 # -z: 压缩传输数据 # -e ssh: 使用 SSH 作为远程 shell # --delete: 删除目标目录中不存在于源目录的文件(使两边完全一致) rsync -avz --delete -e ssh /path/to/local/dir/ user@remote_server_ip:/path/to/remote/dir/
总结与最佳实践
| 需求 | 推荐命令 | 优点 | 缺点 |
|---|---|---|---|
| 简单打包下载 | scp (两步) |
直观,易于理解 | 需要在远程服务器创建临时文件 |
| 高效打包下载 | ssh "tar ..." > ... (一步) |
高效,无临时文件,命令简洁 | 命令稍复杂,不易理解原理 |
| 本地打包上传 | scp |
简单直接 | - |
| 目录同步/增量备份 | rsync |
高效,只传变化,功能强大 | 命令选项较多,需要学习 |
对于绝大多数用户,我强烈推荐使用 ssh "tar -czf - ..." > local_file.tar.gz 的方式,因为它在效率和简洁性之间取得了最好的平衡。
额外提示:
-
排除文件:在
tar命令中使用--exclude来排除不需要的文件。ssh user@remote_server_ip "tar -czf - /path/to/my_project --exclude='*.tmp' --exclude='cache/'" > project_backup.tar.gz
-
解压:下载到本地后,使用以下命令解压:
# 解压到当前目录 tar -xzf project_backup.tar.gz # 解压到指定目录 tar -xzf project_backup.tar.gz -C /path/to/extract/
