通过 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/
-P,小写 -p 表示保留时间戳和权限;写成 -p 2222 会被当成保留模式并忽略端口。rsync --partial --progress。-r 复制目录时不保证保留扩展属性、ACL 和资源分支;macOS 之间备份优先 rsync -aE。-p 只尽量保留模式和时间,普通用户无法保留所有者;跨用户复制后属主通常变成登录用户。StrictHostKeyChecking=accept-new,不要长期关闭校验。subsystem request failed 或 sftp-server: not found,说明没有 SFTP 子系统,用 -O 退回传统协议。Permission denied,先确认远端用户对父目录有写权限,而不是反复换端口。合上页面,先回答,再展开对照。
-P 和 -p 有什么区别?-P 指定 SSH 端口,-p 保留文件的修改时间和权限位;两者大小写含义完全不同。scp -O 强制传统 SCP 协议,绕过对远端 SFTP 子系统的依赖。
小程序版
微信扫码,随时查命令