Linux scp 拷贝传输数据
scp 是 secure copy 的简写,用于在 Linux 下进行远程拷贝文件的命令。和它类似的命令有 cp,不过 cp 只能在本机进行拷贝、不能跨服务器,而且 scp 传输是加密的,可能会稍微影响一点速度。
当服务器硬盘变为只读(read only system)时,用 scp 可以帮你把文件移出来。另外,scp 还非常不占资源,不会提高多少系统负荷。在这一点上,rsync 就远远不及它了——虽然 rsync 比 scp 会快一点,但当小文件众多的情况下,rsync 会导致硬盘 I/O 非常高,而 scp 基本不影响系统正常使用。
实际运维中,scp 最常见的几个用途包括:服务器迁移时把整站文件搬到新机器、从线上服务器把日志或备份拉回本地分析、以及在机器之间分发部署包。它不需要在目标机器上预先开启额外服务,只要目标机开了 SSH(默认 22 端口)就能用,这也是它比 FTP 更受运维欢迎的原因。
1. 命令格式
scp [参数] [原路径] [目标路径]
2. 命令功能
scp 是 secure copy 的缩写,是基于 ssh 登录进行安全的远程文件拷贝命令,可以在 Linux 服务器之间复制文件和目录。
3. 命令参数
| 参数 | 说明 |
|---|---|
-1 |
强制 scp 命令使用协议 ssh1 |
-2 |
强制 scp 命令使用协议 ssh2 |
-4 |
强制 scp 命令只使用 IPv4 寻址 |
-6 |
强制 scp 命令只使用 IPv6 寻址 |
-B |
使用批处理模式(传输过程中不询问传输口令或短语) |
-C |
允许压缩(将 -C 标志传递给 ssh,从而打开压缩功能) |
-p |
保留原文件的修改时间、访问时间和访问权限 |
-q |
不显示传输进度条 |
-r |
递归复制整个目录 |
-v |
详细方式显示输出,scp 和 ssh 会显示出整个过程的调试信息,用于调试连接、验证和配置问题 |
-c cipher |
以 cipher 将数据传输进行加密,直接传递给 ssh |
-F ssh_config |
指定一个替代的 ssh 配置文件 |
-i identity_file |
从指定文件中读取传输时使用的密钥文件 |
-l limit |
限定用户所能使用的带宽,以 Kbit/s 为单位 |
-o ssh_option |
使用 ssh_config 中的参数传递方式 |
-P port |
注意是大写 P,指定数据传输用到的端口号 |
-S program |
指定加密传输时所使用的程序,该程序必须能够理解 ssh 的选项 |
4. 使用实例
从本地服务器复制到远程服务器:
复制文件:
# 指定用户名(执行后需要输入用户密码),仅指定远程目录,文件名不变
scp local_file remote_username@remote_ip:remote_folder
# 指定用户名,并指定远程文件名
scp local_file remote_username@remote_ip:remote_file
# 不指定用户名(执行后需要输入用户名和密码),仅指定远程目录
scp local_file remote_ip:remote_folder
# 不指定用户名,并指定远程文件名
scp local_file remote_ip:remote_file
复制目录:
# 指定用户名
scp -r local_folder remote_username@remote_ip:remote_folder
# 不指定用户名
scp -r local_folder remote_ip:remote_folder
从远程服务器复制到本地服务器:
从远程复制到本地的 scp 命令与上面的命令雷同,只要把从本地复制到远程命令的后 2 个参数互换顺序即可。
实例 1:从远程复制文件到本地目录
scp [email protected]:/opt/soft/nginx-0.5.38.tar.gz /opt/soft/
说明:从 192.168.120.204 机器的 /opt/soft/ 目录中下载 nginx-0.5.38.tar.gz 文件到本地 /opt/soft/ 目录。
实例 2:从远程复制目录到本地
scp -r [email protected]:/opt/soft/mongodb /opt/soft/
说明:从 192.168.120.204 机器上下载 mongodb 目录到本地 /opt/soft/ 目录。
实例 3:上传本地文件到远程机器指定目录
scp /opt/soft/nginx-0.5.38.tar.gz [email protected]:/opt/soft/scptest
说明:复制本地 /opt/soft/ 目录下的 nginx-0.5.38.tar.gz 文件到远程机器 192.168.120.204 的 /opt/soft/scptest 目录。
实例 4:上传本地目录到远程机器指定目录
scp -r /opt/soft/mongodb [email protected]:/opt/soft/scptest
说明:上传本地目录 /opt/soft/mongodb 到远程机器 192.168.120.204 的 /opt/soft/scptest 目录。
实例 5:一次拷贝多个文件,并指定端口与压缩
scp -P 2222 -C file1.txt file2.txt [email protected]:/opt/soft/
说明:将本地的 file1.txt、file2.txt 两个文件通过 2222 端口、开启压缩后一次拷贝到远程目录。-P 指定端口、-C 开启压缩,两者可以和其他参数自由组合。
5. scp 与 rsync 怎么选
虽然 scp 在很多场景足够用,但大文件、重复传输时 rsync 通常更合适:
| 维度 | scp | rsync |
|---|---|---|
| 断点续传 | 不支持 | 支持 |
| 增量传输 | 无(全量) | 有(只传差异) |
| 系统负载 | 低 | 小文件多时 I/O 高 |
| 目标机要求 | 仅需 SSH | 通常需安装 rsync |
| 权限保留 | -p 保留时间/权限 |
默认保留,选项更细 |
简单说:一次性拷贝、或目标机上不方便装 rsync 时用 scp;需要定期同步、文件量大且有变化时用 rsync。
6. 常见错误与排错
| 报错信息 | 原因 | 处理办法 |
|---|---|---|
Permission denied (publickey,password) |
用户名/密码或密钥错误 | 确认用户名与密钥路径,检查目标机 ~/.ssh/authorized_keys |
Connection refused |
目标机 SSH 未监听该端口 | 确认 sshd 已启动、-P 端口与目标机一致 |
Host key verification failed |
目标机公钥变更 | 核对主机指纹,确认无误后清理 ~/.ssh/known_hosts 中对应记录 |
scp: command not found |
缺少 openssh-clients | 安装 openssh-clients(CentOS)或 openssh-client(Ubuntu) |
| 传输很慢 | 网络延迟高或未压缩 | 大文本文件加 -C 压缩,或限速避免影响线上业务 |
传输大文件时建议加 -l 限速,例如 -l 10000 表示限制为 10000 Kbit/s(约 1.2MB/s),避免 scp 占满带宽影响其他业务。
小结
- 传文件不需要
-r,传目录必须加-r; - 指定端口用大写
-P; - 大量小文件场景下
scp对系统 I/O 影响更小,更推荐使用。
如果遇到 scp: command not found,说明本机或目标机缺少 openssh-clients,可参考CentOS 安装 scp 命令。更多 Linux 文件操作与服务器运维内容,请查看云服务器分类下的Linux 服务器运维基础。
参考:OpenSSH scp 手册 https://man.openbsd.org/scp;rsync 官方文档 https://rsync.samba.org/documentation.html
原文链接:https://www.cnblogs.com/cqzhuomi/articles/17284311.html(博客园 CQZHUOMI,转载)