概述

scp(secure copy)是基于 SSH 的安全文件复制工具,用于在本地主机与远程主机之间或两台远程主机之间拷贝文件或目录。

优点:数据通过 SSH 加密传输,语法简单,常用于快速传输单个文件或目录。

缺点:不适合大规模同步(推荐 rsync),对带宽控制与增量传输支持有限。


语法

scp [选项] source target

常用选项

  • -r:递归复制目录(必需用于目录)
  • -P port:指定远程 SSH 端口(注意大写 P)
  • -p:保留源文件的修改时间、访问时间以及模式(权限)
  • -C:开启压缩传输(对慢链路有利)
  • -v:详细模式,显示调试/连接信息
  • -q:安静模式,抑制进度与错误信息
  • -o “SSH-选项”:传递给底层 ssh 的选项,例如 ProxyCommand 或 IdentityFile

示例:通过 2222 端口递归复制目录并启用压缩:

scp -P 2222 -r -C ./mydir user@host:/path/

若要使用特定私钥文件:

scp -i ~/.ssh/id_rsa file user@host:/path/

(注意:某些系统的 scp 版本不支持 -i,写成 -o IdentityFile=~/.ssh/id_rsa 更通用)

scp -o IdentityFile=~/.ssh/id_rsa file user@host:/path/

示例

  1. 将本地单个文件上传到远程:
scp ~/Desktop/report.pdf [email protected]:/home/alice/reports/
  1. 从远程下载整个目录(保留权限和时间):
scp -r -p bob@server:/var/www/html/ ./site-backup/
  1. 使用不同端口和压缩:
scp -P 2222 -C secrets.tar.gz [email protected]:/root/
  1. 从一台远程主机复制到另一台远程主机(由本地发起):
scp user1@host1:/tmp/data.tar.gz user2@host2:/backup/

示例:使用 rsync 替代(断点续传)

# 
# -a: 归档模式,保留文件权限、时间戳、符号链接等.
# -v: 显示详细输出(verbose).
# -z: 启用压缩, 加快传输速度.
# --progress: 显示每个文件的传输进度.
# -e "ssh -p 2222": 指定使用 SSH 协议,并设置端口为 2222.
rsync -avz --progress -e "ssh -p 2222" user@host:/remote/path/ ./localpath/

小技巧

  • 查看 scp 版本/实现:scp -V(注意,有些系统的 scp 使用 OpenSSH 的 scp,会输出 OpenSSH 版本)。