CentOS 安装 scp 命令
在测试环境里往两台虚拟机之间传文件,很多人第一反应就是用 scp,结果一条命令下去就吃了闭门羹:
-bash: scp: command not found
想当然地执行 yum install scp,又被告知:
No package scp available.
为什么找不到 scp
scp 并不是一个独立的软件包,它属于 openssh-clients。这个包在完整安装的 CentOS 里随 OpenSSH 客户端一起装好,但**最小化安装(Minimal)**为了精简体积默认不装,于是 scp、sftp、ssh-keygen 这些命令全都缺失。yum install scp 自然找不到对应的包名。
参考:openssh 官方说明 https://www.openssh.com/manual.html;CentOS 仓库中该命令由 openssh-clients 提供,可用
yum whatprovides '*/scp'验证。
解决方法
安装 openssh-clients:
yum install openssh-clients -y
安装完成后再次运行:
scp 1.so [email protected]:/root/
输入密码后居然又提示:
bash: scp: command not found
这是因为 scp 传输需要两端都具备相应组件:本机是客户端角色,目标主机是服务端角色。虽然 sshd 服务端通常会依赖 openssh-clients,但最小化环境下某些发行版并未把它作为强依赖装上。在目标主机上也装一遍即可:
yum install openssh-clients -y
再次尝试,问题解决。可用 which scp 验证命令是否就位。
scp 常用姿势
scp 的语法和 cp 类似,只是多了主机前缀:
# 本机 -> 远程
scp ./backup.tar.gz [email protected]:/root/backup/
# 远程 -> 本机
scp [email protected]:/root/logs/app.log ./logs/
# 指定端口(ssh 不在 22 端口时)
scp -P 2222 ./file [email protected]:/root/
# 递归拷贝整个目录
scp -r ./site/ [email protected]:/var/www/
# 保留时间戳和权限
scp -p ./config.conf [email protected]:/etc/
常用参数:-P 指定端口(大写),-r 递归目录,-p 保留文件属性,-C 开启压缩,-i 指定密钥文件。传输大目录时,rsync -avz 通常比 scp 更高效(支持断点续传和增量同步),但临时传一两个文件 scp 最直接。
还有个小技巧:scp 也可以配合管道直接流式传输,比如 tar czf - ./data | ssh [email protected] 'tar xzf - -C /opt/data',打包和传输一步完成,省掉中间的临时文件。网络一般时,压缩后再传通常比裸传快不少。
常见问题与排错
1. 提示 Permission denied (publickey,password)
密码正确却一直弹这个错,通常不是 scp 的问题:要么目标主机的 /etc/ssh/sshd_config 里 PasswordAuthentication 被设为 no,要么 SELinux/防火墙(如 firewalld)挡住了 22 端口。先在本机 ssh [email protected] 看能不能登录,能登录再谈 scp;ssh 都进不去,scp 也一定不行。
2. 提示 Host key verification failed
第一次连新主机,或目标主机重装系统换了密钥,ssh 会拒绝连接。确认目标主机可信后,删除旧的 host key 记录再重试:
ssh-keygen -R 192.168.0.182
3. 传输很慢
先看是不是网络本身慢,再考虑 scp -C 开启压缩(对文本、日志、代码这类可压缩内容有效,对已压缩的 tar.gz 反而更慢)。大目录建议改用 rsync -avz --progress,支持断点续传,中断后重跑会跳过已传完的部分。
scp 与其它传输方式对比
| 方式 | 适用场景 | 断点续传 | 加密 | 备注 |
|---|---|---|---|---|
| scp | 临时传一两个文件 | 无 | SSH 加密 | 最直接,无需额外安装 |
| rsync | 大目录、增量同步 | 支持 | 走 SSH | 效率最高,推荐日常使用 |
| sftp | 交互式浏览远端文件 | 手动 | SSH 加密 | 类似 FTP 但走 SSH 通道 |
| wget/curl | 从 HTTP/HTTPS 拉取 | 部分支持 | 取决于协议 | 适合下载公共资源 |
其实对运维来说,scp 更常扮演"随手传个配置文件"的角色:比如把刚改好的 nginx.conf 推到线上,或把生产环境的日志拉回本地排查。这类场景里,记住 -P 端口(大写)、-r 递归、-p 保留属性三个参数,基本就够用了。
举个真实场景:你要把本地打包好的 release-2026.08.tar.gz(约 3.2GB)推到生产服务器。直接 scp 会占满带宽,别人访问网站都可能变卡。更稳妥的做法是先确认内容可压缩,再用 rsync -avz --bwlimit=20480 把速度限到 20MB/s 慢慢推,配合 --partial 保证断了还能续。这类"大文件 + 不阻塞业务"的场景,scp 反而不是首选。
用密钥免密传输
如果嫌每次输密码麻烦,可以配置 SSH 密钥登录,scp 就再也不用交互式输入密码了:
# 在本机生成密钥对(一路回车即可)
ssh-keygen -t ed25519 -C "[email protected]"
# 把公钥推送到目标主机
ssh-copy-id [email protected]
之后 scp ./file [email protected]:/root/ 直接就能传。配合 -i ~/.ssh/id_ed25519 指定密钥,或者用 ssh-agent 管理多把密钥,脚本里写 scp 也不会被密码卡住。相比密码,密钥还更安全——ed25519 比老的 RSA 2048 短而快,目前是默认推荐。
小结
遇到 scp 缺失,先别急着排查网络或权限,大概率只是最小化安装没带 openssh-clients,装一下就好。记住下面几点基本就不会再被卡住:
scp命令由openssh-clients软件包提供,yum install scp是不存在的包名;- 报
command not found时,先检查本机是否安装openssh-clients,可用rpm -q openssh-clients确认; - 从本机向目标主机传输时,目标主机同样需要 openssh-clients(由 sshd 依赖提供,但最小化安装可能缺失);
- 安装后可用
which scp验证命令是否可用。
scp 是 Linux 服务器之间安全传输文件的常用命令,关于 scp 的详细参数和使用实例可以参考Linux scp 拷贝传输数据。更多服务器运维内容请查看云服务器分类,例如服务器运维技巧。
原文链接:https://www.cnblogs.com/cqzhuomi/articles/17284333.html(博客园 CQZHUOMI,转载)