跳转到内容

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 SCP

6. 高级用法技巧

技巧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 refusedSSH服务未启动或端口错误检查远程服务器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/目录下,并保留原文件的修改时间。

评论区

专业的Linux技术学习平台,从入门到精通的完整学习路径