主题
Linux SCP命令详解
课程介绍
接下来我们学习SCP文件传输命令。SCP是基于SSH协议的文件传输工具,安全可靠。用scp可以在不同Linux服务器之间传输文件,比如scp file.txt user@node2:/tmp/把本地文件传到远程服务器。支持单个文件和整个目录的传输,传输过程加密安全。SCP在集群环境中经常用于分发配置文件,是文件传输的利器。
1. Linux文件传输命令深解
2. SCP命令概述
SCP(Secure Copy)是CP命令的升级版,通过SSH协议完成文件的相互复制。它的主要功能是在不同的Linux服务器之间相互传输文件。
核心特点:
- 基于SSH协议,传输过程加密安全
- 支持本地到远程、远程到本地的双向传输
- 可以传输单个文件或整个目录
- 支持用户名密码认证或密钥认证
NOTE
只要能够知晓目标服务器的账户和密码或密钥,就可以使用SCP进行文件传输。
3. SCP命令基础语法
基本格式
bash
scp [选项] 参数1 参数2参数说明:
- 参数1和参数2都可以表示本地路径或远程目标路径
- 含义:将参数1的内容复制到参数2的位置
路径表示方法
- 本地路径:直接使用文件或目录的绝对路径或相对路径
- 远程路径:格式为
[用户名@]服务器地址:文件路径
4. 常用选项说明
| 选项 | 功能说明 |
|---|---|
| -r | 递归复制整个目录,只要复制中包含文件夹就必须使用 |
| -P | 指定远程服务器的SSH端口号(默认22) |
| -p | 保留原文件的修改时间、访问时间和权限 |
| -q | 安静模式,不显示传输进度条 |
| -C | 启用压缩传输,提高传输速度 |
重点强调:
IMPORTANT
复制文件夹时,必须使用 -r 选项,否则会失败!
5. 实战演示
演示环境准备
- 三台Linux服务器:node1、node2、node3
- 已配置root用户的免密登录
- 服务器之间可以通过SSH正常通信
场景1:本地文件复制到远程服务器
操作步骤:
- 在node1上准备一个测试文件
bash
# 在node1上执行
cd ~
echo "Hello SCP" > jdk.txt- 使用SCP将文件复制到node2
bash
# 在node1上执行
scp jdk.txt root@node2:/root/- 验证传输结果
bash
# 在node2上执行
ls -l /root/jdk.txt
cat /root/jdk.txt预期输出:
-rw-r--r-- 1 root root 10 Jan 12 20:00 /root/jdk.txt
Hello SCP场景2:远程文件复制到本地
操作步骤:
- 在node3上从node2拉取文件
bash
# 在node3上执行
scp node2:/root/jdk.txt .- 验证传输结果
bash
# 在node3上执行
ls -l jdk.txt
cat jdk.txt预期输出:
-rw-r--r-- 1 root root 10 Jan 12 20:01 jdk.txt
Hello SCP场景3:复制整个目录
操作步骤:
- 在node1上创建测试目录和文件
bash
# 在node1上执行
mkdir -p test
cp jdk.txt test/- 使用SCP复制目录到node2
bash
# 在node1上执行
scp -r test root@node2:/root/- 验证传输结果
bash
# 在node2上执行
ls -l /root/test/
cat /root/test/jdk.txt预期输出:
-rw-r--r-- 1 root root 10 Jan 12 20:02 jdk.txt
Hello SCP6. 高级用法技巧
技巧1:复制到同名目录
当需要将文件复制到远程服务器的同名目录时,可以使用$(pwd)或$PWD来获取当前工作目录:
bash
# 方法1:使用命令替换
cd /export/server
scp jdk.txt node2:$(pwd)/
# 方法2:使用环境变量
cd /export/server
scp jdk.txt node2:$PWD/效果: 将本地/export/server/jdk.txt文件复制到远程服务器node2的/export/server/目录下。
技巧2:省略用户名
如果本地和远程服务器使用相同的用户名,可以省略远程用户名:
bash
# 完整写法
scp jdk.txt root@node2:/root/
# 简化写法(当本地也是root用户时)
scp jdk.txt node2:/root/技巧3:指定端口号
如果远程服务器的SSH端口不是默认的22,可以使用-P选项指定端口:
bash
scp -P 2222 jdk.txt node2:/root/| 功能描述 | 命令示例 |
|---|---|
| 本地文件复制到远程 | scp local.txt remote:/path/ |
| 远程文件复制到本地 | scp remote:/path/file.txt . |
| 本地目录复制到远程 | scp -r local_dir remote:/path/ |
| 远程目录复制到本地 | scp -r remote:/path/dir . |
| 复制到同名目录 | scp file.txt remote:$(pwd)/ |
| 指定端口复制 | scp -P 2222 file.txt remote:/path/ |
7. 常见问题与解决方案
| 问题描述 | 可能原因 | 解决方案 |
|---|---|---|
复制目录时出现错误:not a regular file | 没有使用-r选项 | 在命令中添加-r选项 |
提示:Permission denied | 目标路径没有写入权限 | 检查目标路径的权限或使用具有权限的用户 |
提示:Connection refused | SSH服务未启动或端口错误 | 检查远程服务器SSH服务状态或端口设置 |
| 传输速度慢 | 网络环境问题 | 使用-C选项启用压缩传输 |
扩展阅读
NOTE
课后请完成所有练习,并尝试在实际环境中使用SCP命令进行文件传输操作,加深对命令的理解和掌握。
课程总结
这节课我们学了SCP命令,用于服务器间传输文件。
基本语法: scp 本地文件 用户@远程主机:远程路径 - 上传文件 scp 用户@远程主机:远程文件 本地路径 - 下载文件
常用选项: -r - 递归复制目录 -P 端口 - 指定端口
实战示例: scp test.txt root@192.168.1.100:/tmp/ - 上传文件 scp -r /data/ root@192.168.1.100:/backup/ - 上传目录 scp -P 2222 test.txt root@192.168.1.100:/tmp/ - 指定端口
SCP基于SSH协议,传输加密,适合服务器间文件传输。
课后练习
基础练习:将本地的
/tmp/test.txt文件复制到远程服务器node2的/home/user/目录下。进阶练习:将远程服务器
node2的/var/log/目录复制到本地的/tmp/目录下。综合练习:从服务器
node1的/export/data/目录复制所有.log文件到服务器node3的/backup/logs/目录下,并保留原文件的修改时间。