菜鸟科技网

shell scp命令

scpsecure copy 的缩写,是一个在 Linux/Unix 系统下用于通过网络在主机之间安全地复制文件的工具,它的底层依赖于 SSH 协议来保证数据传输的安全性。

shell scp命令-图1
(图片来源网络,侵删)

核心语法

scp 的基本语法非常灵活,可以从本地复制到远程,也可以从远程复制到本地。

# 从本地复制到远程
scp [选项] 本地文件名 远程用户@远程主机:远程路径
# 从远程复制到本地
scp [选项] 远程用户@远程主机:远程文件名 本地路径

常用选项

选项 全称 描述
-P port 指定远程主机的 SSH 端口。注意:大写 P,因为小写 -p 已被用于保留文件修改时间等属性。
-r recursive 递归复制整个目录。
-p preserve 保留文件的原始时间戳、权限、所有者等信息。
-C compress 在传输过程中启用压缩,可以加快在慢速网络上的传输速度。
-q quiet 静默模式,不显示进度条或警告信息。
-v verbose 详细模式,会显示整个连接过程的调试信息,方便排查问题。
-i identity_file 指定用于连接的私钥文件路径。

实用示例

场景准备

假设我们有以下环境:

  • 本地主机: local_machine (IP: 168.1.10)
  • 远程主机: remote_server (IP: 0.113.10, 用户名: ubuntu)
  • SSH端口: 2222 (非默认的22端口)
  • 本地文件: ~/project/report.txt
  • 本地目录: ~/project/assets/
  • 远程目录: /home/ubuntu/backups/

复制单个文件到远程

将本地的 report.txt 文件复制到远程主机的 /home/ubuntu/ 目录下。

# 基本用法
scp report.txt ubuntu@remote_server:/home/ubuntu/
# 指定远程路径(不一定是家目录)
scp report.txt ubuntu@remote_server:/tmp/

从远程复制单个文件到本地

将远程主机上的 report.txt 文件复制到当前本地目录。

# 基本用法
scp ubuntu@remote_server:/home/ubuntu/report.txt .
# 指定本地路径
scp ubuntu@remote_server:/home/ubuntu/report.txt ~/Downloads/

复制整个目录到远程

使用 -r (recursive) 选项来递归复制目录。

# 将本地的 'assets' 目录复制到远程主机的 '/home/ubuntu/backups/' 目录下
# 远程路径会变成 /home/ubuntu/backups/assets/
scp -r assets/ ubuntu@remote_server:/home/ubuntu/backups/

从远程复制整个目录到本地

# 将远程的 'backups/assets' 目录复制到当前本地目录
scp -r ubuntu@remote_server:/home/ubuntu/backups/assets/ .

指定非标准 SSH 端口

如果远程主机的 SSH 服务运行在非 22 端口(2222),必须使用 -P 选项。

# 复制文件到端口为 2222 的远程主机
scp -P 2222 report.txt ubuntu@remote_server:/home/ubuntu/
# 从端口为 2222 的远程主机复制文件
scp -P 2222 ubuntu@remote_server:/home/ubuntu/report.txt .

使用特定的 SSH 私钥文件

如果连接需要使用特定的私钥(id_rsa_myserver),使用 -i 选项。

# 使用 ~/.ssh/id_rsa_myserver 这个私钥进行认证
scp -i ~/.ssh/id_rsa_myserver report.txt ubuntu@remote_server:/home/ubuntu/

保留文件属性(时间戳、权限等)

使用 -p 选项,可以确保复制后的文件与原文件拥有相同的时间戳和权限。

scp -p report.txt ubuntu@remote_server:/home/ubuntu/

启用压缩传输

对于包含大量小文件或文本的目录,启用压缩可以显著提高传输速度。

# 复制目录并启用压缩
scp -rC assets/ ubuntu@remote_server:/home/ubuntu/backups/

结合多个选项

scp 命令可以自由组合多个选项。

# 示例:将本地的 'assets' 目录,通过端口 2222,使用特定私钥,
# 启用压缩并保留属性,递归地复制到远程主机的指定目录。
# 注意选项的顺序通常不重要。
scp -r -C -p -P 2222 -i ~/.ssh/id_rsa_myserver assets/ ubuntu@remote_server:/home/ubuntu/backups/

scp vs rsync

scp 非常方便,但在处理大量文件或需要增量同步时,rsync 通常是更好的选择。

特性 scp rsync
核心功能 安全地复制文件/目录 远程同步文件/目录
传输效率 每次都是全量传输,如果文件中途中断,需要重新开始。 智能增量同步,只传输文件变化的部分,效率极高,支持断点续传。
带宽控制 不支持 支持 --bwlimit 选项,可以限制传输占用的带宽。
删除文件 不支持 支持 --delete 选项,可以使目标目录和源目录完全一致(删除目标中多余文件)。
文件列表 不支持 可以只同步匹配特定模式的文件(通过 --include/--exclude)。
适用场景 一次性、小批量文件复制;快速简单操作。 需要频繁同步、备份大量数据;需要增量更新;需要精确控制同步行为。

  • 快速复制几个文件?scp
  • 需要定期同步一个目录,并只传输变化的部分?rsync

scp 是系统管理员和开发人员必备的工具之一,它简单、直接、安全,记住其核心语法 [选项] 源文件 目标地址,并熟练掌握 -r, -P, -p, -i 等常用选项,就能应对绝大多数文件传输场景,对于更复杂的同步需求,则可以转向功能更强大的 rsync

分享:
扫描分享到社交APP
上一篇
下一篇