scp和sftp均基于ssh加密通道实现安全文件传输,无需额外服务;scp适用于非交互式单次复制,语法类似cp,支持-r递归、-p指定端口、-i指定密钥;sftp提供交互式ftp类操作,支持ls/get/put/mkdir等命令,适合多步文件管理。

Linux 运维中用 scp 和 sftp 传文件,核心就一条:它们都走 SSH 加密通道,不需要额外开服务或配协议,只要能 ssh 登录,就能安全传。
scp:适合“一次复制”,命令像 cp 一样直觉
scp 是非交互式工具,适合明确知道源和目标、想快速拷一份就完事的场景。它不关心远程目录结构,只管把东西送过去。
- 本地 → 远程(常用):
scp file.txt user@192.168.1.100:/home/user/ - 远程 → 本地(下载):
scp user@192.168.1.100:/var/log/syslog ~/logs/ - 复制整个目录加
-r:scp -r myapp/ user@host:/opt/(注意末尾斜杠不影响行为,和 rsync 不同) - 非默认端口用大写
-P(不是小写 p):scp -P 2222 config.yml user@host:/etc/myapp/ - 指定私钥路径:
scp -i ~/.ssh/deploy_key.pem -P 2222 app.tar.gz user@host:/tmp/
sftp:适合“边连边操作”,类 FTP 的交互体验
sftp 启动后进入命令行交互界面,可以反复上传、下载、建目录、删文件、查权限,适合需要多次操作或不确定要传哪些文件的场景。
- 连接:
sftp -P 2222 user@192.168.1.100(成功后提示sftp>) - 常用命令:
-
ls/lls(查远程 / 本地列表) -
get remote.log local.log(下载) -
put script.sh /usr/local/bin/(上传) -
mkdir backup/rm old.zip -
quit或exit退出
-
- 支持批量操作:
sftp> mget *.conf或mput logs/*.log - 想跳过交互直接执行单条命令:
sftp user@host -b -
关键安全与权限提醒
两者都依赖 SSH 认证,但实际使用中容易忽略几个细节:
- 密码认证虽可用,但生产环境强烈建议用密钥登录——生成时优先选
ed25519:ssh-keygen -t ed25519 -C "prod-deploy" - 私钥文件权限必须是
600,否则 SSH 拒绝读取:chmod 600 ~/.ssh/id_ed25519 - scp 默认不保留所有者和组,目标文件归属变成当前登录用户;如需保持时间戳和权限,加
-p(但 ACL、SELinux 上下文仍不保留) - 传输大文件或敏感配置前,可先用
ssh -T user@host测试连通性和认证是否正常
什么时候选哪个?简单判断标准
看任务性质,不看偏好:
- 自动化脚本里传固定文件 → 用 scp(易写、易调试、无状态)
- 临时排查要来回拉日志、试改配置、列目录找文件 → 用 sftp(交互灵活,不用反复敲命令)
- 要同步大量内容或只传变更部分 → 切到 rsync over SSH(比如
rsync -avz --delete src/ user@host:/dst/)











