SCP命令完整使用教程:文件与目录的上传下载实战

245 阅读7分钟

SCP命令完整使用教程:文件与目录的上传下载实战

SCP(Secure Copy Protocol,安全复制协议)是基于SSH(Secure Shell)的文件传输工具,其核心优势在于加密传输,能确保文件在本地与远程主机、或两台远程主机之间传输时的安全性,广泛应用于服务器管理、数据备份等场景。本教程将从基础语法出发,重点讲解文件/目录的上传与下载操作,并结合实际场景提供可直接复用的案例。

一、前置条件:确保环境可正常使用SCP

SCP依赖SSH协议实现通信,使用前需满足以下条件,否则会导致传输失败:

  • 本地环境:Windows需安装PuTTY(附带pscp工具)、Git Bash或WSL(Windows Subsystem for Linux);macOS/Linux系统默认自带SCP,可直接在终端使用。
  • 远程主机:已开启SSH服务(默认端口22,若修改需指定端口),且本地主机能通过IP/域名访问远程主机,同时拥有远程主机的合法账号(需具备目标路径的读写权限)。
  • 测试连通性:可通过ssh 用户名@远程IP测试,能成功登录则说明SSH通信正常。

二、SCP核心语法解析

SCP命令的核心逻辑是“指定源路径”和“指定目标路径”,不同传输方向(上传/下载)仅需调整路径的位置。基础语法分为两种场景:

2.1 通用基础语法

scp [可选参数] 源文件/目录 目标用户@目标IP:目标路径

2.2 关键可选参数

参数用于适配不同传输需求,常用参数如下:

参数功能说明适用场景
-r递归复制整个目录(包含子目录和文件)传输目录时必须添加,否则报错
-P(大写)指定远程主机的SSH端口(默认22,若修改需指定)远程主机SSH端口非默认(如2222)时使用
-p保留源文件的修改时间、访问时间和权限需要精确同步文件属性的场景(如备份)
-v显示详细的传输过程(调试用)传输失败时排查问题(如权限、路径错误)

三、核心操作:上传与下载(文件+目录)

以下案例统一使用“本地主机”和“远程主机”的模拟环境,方便理解:

模拟环境信息: 本地主机:macOS/Linux系统,本地文件路径/Users/xxx/local_data/ 远程主机:IP为192.168.1.100,用户名root,SSH默认端口22,远程路径/root/remote_data/ 若为Windows本地,路径格式改为C:\Users\xxx\local_data(Git Bash/WSL中可写为/c/Users/xxx/local_data/

3.1 本地 → 远程:文件上传

场景:开发者将本地编写的应用程序包(如app.jar)上传到云服务器,用于部署运行。

语法
scp [参数] 本地文件路径 远程用户名@远程IP:远程目标路径
实际案例

将本地/Users/xxx/local_data/app.jar上传到远程主机的/root/remote_data/目录:

scp /Users/xxx/local_data/app.jar root@192.168.1.100:/root/remote_data/

执行过程说明:输入命令后,终端会提示输入远程主机root用户的密码,输入正确后开始传输,传输完成后无额外提示(可通过远程主机查看文件是否存在)。

特殊场景扩展:若远程主机SSH端口为2222,需添加-P参数:

scp -P 2222 /Users/xxx/local_data/app.jar root@192.168.1.100:/root/remote_data/

3.2 本地 → 远程:目录上传

场景:运维人员将本地的网站静态资源目录(如website_static)上传到服务器的网站根目录,用于更新网站内容。

语法
scp -r [其他参数] 本地目录路径 远程用户名@远程IP:远程目标路径

关键:目录传输必须添加-r参数(递归复制),否则会提示“不是常规文件”并失败。

实际案例

将本地/Users/xxx/local_data/website_static目录(含子目录和文件)上传到远程/root/remote_data/目录:

scp -r /Users/xxx/local_data/website_static root@192.168.1.100:/root/remote_data/

结果验证:登录远程主机后,执行ls /root/remote_data/,可看到website_static目录已存在,内部文件结构与本地一致。

3.3 远程 → 本地:文件下载

场景:开发者从云服务器下载应用程序的日志文件(如app.log),用于排查程序运行错误。

语法
scp [参数] 远程用户名@远程IP:远程文件路径 本地目标路径

核心区别:与上传相反,源路径为远程文件路径,目标路径为本地路径。

实际案例

将远程主机/root/remote_data/app.log日志文件下载到本地/Users/xxx/local_data/logs/目录(本地logs目录需提前创建):

scp root@192.168.1.100:/root/remote_data/app.log /Users/xxx/local_data/logs/

简化技巧:若想下载到本地当前终端所在目录,可将本地目标路径改为.(代表当前目录):

scp root@192.168.1.100:/root/remote_data/app.log .

3.4 远程 → 本地:目录下载

场景:运维人员从服务器下载用户上传的图片资源目录(如user_images),用于本地备份。

语法
scp -r [参数] 远程用户名@远程IP:远程目录路径 本地目标路径
实际案例

将远程/root/remote_data/user_images目录下载到本地/Users/xxx/local_data/backup/目录:

scp -r root@192.168.1.100:/root/remote_data/user_images /Users/xxx/local_data/backup/

结果验证:打开本地/Users/xxx/local_data/backup/目录,可看到下载后的user_images目录及内部所有文件。

四、进阶场景:免密传输与批量操作

4.1 免密传输:避免重复输入密码

频繁传输时,每次输入密码效率低,可通过SSH密钥认证实现免密登录,进而免密使用SCP:

  1. 本地生成SSH密钥对:终端执行以下命令,一路回车(无需设置密码),会在~/.ssh/目录生成id_rsa(私钥)和id_rsa.pub(公钥): ssh-keygen -t rsa
  2. 将公钥上传到远程主机:执行以下命令,输入远程密码后,公钥会被添加到远程~/.ssh/authorized_keys文件中: ssh-copy-id root@192.168.1.100
  3. 测试免密SCP:再次执行上传/下载命令,无需输入密码即可直接传输。

4.2 批量传输:结合通配符匹配文件

需传输多个同类文件时,可使用通配符(如*)匹配:

案例:将本地/Users/xxx/local_data/目录下所有.txt文件上传到远程目录:

scp /Users/xxx/local_data/*.txt root@192.168.1.100:/root/remote_data/

五、常见错误与解决方案

错误提示可能原因解决方案
Connection refused远程主机未开启SSH服务,或端口错误1. 远程执行systemctl start sshd开启服务;2. 确认端口并添加-P参数
Permission denied远程用户无目标路径的读写权限,或本地路径无写入权限1. 更换有权限的远程用户;2. 远程执行chmod 755 目标路径开放权限
not a regular file传输目录时未加-r参数在命令中添加-r参数(递归复制目录)
No such file or directory本地或远程路径不存在1. 执行ls 路径验证路径正确性;2. 不存在则创建(mkdir -p 路径

六、总结:核心操作速查表

操作类型命令示例关键参数
本地文件上传scp /local/file root@ip:/remote/path无(单文件)
本地目录上传scp -r /local/dir root@ip:/remote/path-r(递归)
远程文件下载scp root@ip:/remote/file /local/path无(单文件)
远程目录下载scp -r root@ip:/remote/dir /local/path-r(递归)
指定端口上传scp -P 2222 /local/file root@ip:/remote/path-P(指定端口)

SCP命令的核心是“路径定位”和“参数适配”,掌握文件/目录的传输逻辑后,结合免密登录和通配符等技巧,可大幅提升服务器文件管理效率。实际使用中若遇到问题,可添加-v参数查看详细传输日志,快速定位错误原因。

image.png