系统学习 macOS 学习路径:从 BSD 文件命令到系统、网络与开发维护

scp

通过 SSH 在 macOS 与远程主机之间复制文件。

补充说明

scp 复用 ssh 的认证和加密,语法是 scp 源 目标,远端写成 user@host:/path。递归复制目录用 -r,指定端口用大写的 -P,指定密钥用 -i,限速用 -l(Kbit/s)。它适合一次性拷贝和小文件;大量文件、需要断点续传或保留扩展属性时改用 rsync。

OpenSSH 9.0 起 scp 默认改用 SFTP 协议传输,macOS 13 及以后自带版本已采用这一行为;macOS 12 等老系统仍是传统 SCP。两者在通配符展开、错误信息和符号链接处理上不同,老服务器没有 SFTP 子系统时会报错,此时用 -O 强制传统 SCP 协议。

macOS 的钥匙串集成对 scp 也有效,但 scp 没有 --apple-use-keychain 这种参数;可以通过 -o UseKeychain=yes 或 ~/.ssh/config 让底层 ssh 使用钥匙串。自动化脚本应加 BatchMode=yes,避免卡在口令或主机指纹提示上。

常用示例

# 上传单个文件到远端目录
% scp ./report.pdf user@host:/Users/user/Documents/

# 下载远端文件到当前目录
% scp user@host:/var/log/app.log .

# 指定端口和私钥
% scp -P 2222 -i ~/.ssh/id_ed25519 ./app.tar.gz user@host:/srv/

# 递归复制目录;远端目录不存在时会按文件名创建
% scp -r ./assets user@host:/srv/app/

# 保留修改时间和权限位
% scp -p ./deploy.sh user@host:/usr/local/bin/

# 限制带宽约 5 Mbit/s,避免占满上行
% scp -l 5000 ./backup.tar.gz user@host:/backup/

# 使用钥匙串中的私钥口令
% scp -o UseKeychain=yes ./file user@host:/tmp/

# 老服务器不支持 SFTP 时退回传统 SCP 协议
% scp -O ./firmware.bin admin@192.0.2.1:/tmp/

易错点与排错

相关命令

参考链接

读完自测

合上页面,先回答,再展开对照。

  1. scp 的 -P 和 -p 有什么区别?
  2. 为什么大文件传输不建议用 scp?
  3. 老服务器报 SFTP 相关错误时怎样兼容?
答案
  1. -P 指定 SSH 端口,-p 保留文件的修改时间和权限位;两者大小写含义完全不同。
  2. scp 不支持断点续传和增量校验,中断后要从头传,弱网和大文件效率低;应使用 rsync。
  3. 用 scp -O 强制传统 SCP 协议,绕过对远端 SFTP 子系统的依赖。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令