CentOS 安装 scp 命令

在测试环境里往两台虚拟机之间传文件,很多人第一反应就是用 scp,结果一条命令下去就吃了闭门羹:

-bash: scp: command not found

想当然地执行 yum install scp,又被告知:

No package scp available.

为什么找不到 scp

scp 并不是一个独立的软件包,它属于 openssh-clients。这个包在完整安装的 CentOS 里随 OpenSSH 客户端一起装好,但**最小化安装(Minimal)**为了精简体积默认不装,于是 scpsftpssh-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_configPasswordAuthentication 被设为 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,装一下就好。记住下面几点基本就不会再被卡住:

  1. scp 命令由 openssh-clients 软件包提供,yum install scp 是不存在的包名;
  2. command not found 时,先检查本机是否安装 openssh-clients,可用 rpm -q openssh-clients 确认;
  3. 从本机向目标主机传输时,目标主机同样需要 openssh-clients(由 sshd 依赖提供,但最小化安装可能缺失);
  4. 安装后可用 which scp 验证命令是否可用。

scp 是 Linux 服务器之间安全传输文件的常用命令,关于 scp 的详细参数和使用实例可以参考Linux scp 拷贝传输数据。更多服务器运维内容请查看云服务器分类,例如服务器运维技巧

原文链接:https://www.cnblogs.com/cqzhuomi/articles/17284333.html(博客园 CQZHUOMI,转载)