菜鸟科技网

scp命令如何拷贝文件?

下面我将从基本用法、常见场景、高级选项和常见问题几个方面,详细讲解 scp 命令。

scp命令如何拷贝文件?-图1
(图片来源网络,侵删)

基本语法

scp 的基本语法结构如下:

# 从本地拷贝到远程
scp [选项] [本地源文件] [用户名@远程主机IP:远程目标路径]
# 从远程拷贝到本地
scp [选项] [用户名@远程主机IP:远程源文件] [本地目标路径]
# 在两台远程主机之间拷贝(需要本地主机作为中转)
scp [选项] [用户名1@主机1:文件路径] [用户名2@主机2:文件路径]

核心参数详解

[本地源文件][远程源文件]

这是你要拷贝的文件或目录的路径。

  • 本地文件: 直接写本地路径,./my_document.txt/home/user/data.zip
  • 远程文件: 格式为 [用户名@远程主机IP:文件路径]root@192.168.1.100:/var/www/html/index.html

[用户名@远程主机IP:远程目标路径][本地目标路径]

这是文件拷贝后要存放的位置。

  • 远程目标路径: 格式同上,backup@192.168.1.200:/mnt/backups/
  • 本地目标路径: 直接写本地路径,~/Downloads//opt/

[选项]

scp 提供了许多有用的选项,这里列出最常用的几个:

scp命令如何拷贝文件?-图2
(图片来源网络,侵删)
选项 全称 说明
-P port 指定远程主机上 SSH 服务监听的端口号。注意:大写P,因为小写 -p 已被用于保留文件修改时间等属性。
-r recursive 递归拷贝,如果源文件是一个目录,必须使用此选项来拷贝该目录下的所有内容。
-p preserve 保留文件的修改时间访问时间权限模式
-C compress 在传输过程中开启压缩,对于慢速网络或大文件,可以显著提高传输速度。
-v verbose 详细模式,显示整个连接过程中的调试信息,有助于排查连接问题。
-i identity_file 指定一个私钥文件来代替默认的私钥进行身份验证。
-4 / -6 ipv4 / ipv6 强制使用 IPv4 或 IPv6 地址进行连接。

常见使用场景

场景1:从本地拷贝文件到远程服务器

这是最常见的用法,比如将本地的代码或备份上传到服务器。

# 将本地当前目录下的 file.txt 拷贝到远程服务器的 /home/username/ 目录下
scp file.txt username@remote_host:/home/username/
# 将本地目录 my_project 整个拷贝到远程服务器的 /var/www/ 目录下(注意 -r)
scp -r my_project username@remote_host:/var/www/
# 使用指定端口(2222)拷贝文件
scp -P 2222 file.txt username@remote_host:/home/username/
# 拷贝文件并保留其原始属性,同时开启压缩
scp -p -C file.txt username@remote_host:/home/username/

场景2:从远程服务器下载文件到本地

比如从服务器下载日志文件或备份文件。

# 将远程服务器上的 /home/username/remote_file.txt 下载到本地当前目录
scp username@remote_host:/home/username/remote_file.txt .
# 将远程服务器上的整个 logs 目录下载到本地的 ~/Downloads/ 目录下
scp -r username@remote_host:/var/log/ ~/Downloads/
# 使用指定端口下载文件
scp -P 2222 username@remote_host:/home/username/remote_file.txt .

场景3:在两台远程主机之间直接拷贝文件

这个场景比较特殊,它不是从本地发起的拷贝,而是让本地主机作为“信使”,连接两台远程主机完成文件传输,这种方式的好处是,你的本地机器不需要有足够的磁盘空间来暂存这个大文件。

# 将主机A上的文件,直接拷贝到主机B上
# 本地主机需要能无密码登录到主机A和主机B(通常使用SSH密钥)
scp username1@host1:/path/to/file.txt username2@host2:/path/to/destination/

进阶技巧与注意事项

使用 SSH 密钥认证(推荐)

每次都输入密码很麻烦,也不安全,配置好 SSH 密钥后,scp 可以实现无密码登录。

  • 步骤:
    1. 在本地主机生成 SSH 密钥对(如果还没有的话):ssh-keygen -t rsa
    2. 将公钥(~/.ssh/id_rsa.pub)复制到远程主机的 ~/.ssh/authorized_keys 文件中。
      ssh-copy-id username@remote_host
  • 效果: 之后所有使用 sshscp 的连接都将自动使用密钥认证,无需输入密码。

指定私钥文件

如果你有多个私钥文件,或者私钥不在默认位置 (~/.ssh/id_rsa),可以使用 -i 选项指定。

# 使用 ~/.ssh/my_custom_key 这个私钥连接
scp -i ~/.ssh/my_custom_key file.txt username@remote_host:/home/username/

scprsync 的选择

scp 非常简单易用,但对于增量同步(只同步变化的部分)和断点续传rsync 是更好的选择。

  • rsync 的优势:

    • 高效: 只拷贝源文件和目标文件之间有差异的部分,非常适合同步大目录。
    • 断点续传: 如果传输中断,rsync 可以从断点继续传输,而不是从头开始。
    • 更多功能: 如删除目标端多余的文件、显示传输进度条等。
  • 何时用 scp:

    • 一次性、简单的文件拷贝。
    • 确保所有文件的属性(时间戳、权限)都被保留。
    • 不需要增量同步功能。

常见问题排查

Permission denied (publickey,password).

这表示认证失败,可能的原因:

  • 用户名或密码错误。
  • SSH 密钥没有正确设置。
  • 远程主机的 SSH 服务配置禁止了密码登录或密钥登录。
  • 指定的私钥文件不正确或权限不正确(私钥文件权限通常需要设置为 600)。

ssh: connect to host xxx port 22: Connection timed out

无法连接到远程主机。

  • 检查网络: 确保本地机器可以访问远程主机的 IP 地址。
  • 检查防火墙: 确认远程主机的防火墙(如 ufw, firewalld)允许 22 端口的入站连接。
  • 检查 SSH 服务: 确认远程主机上的 SSH 服务正在运行 (sudo systemctl status ssh)。
  • 检查 IP 和端口: 确认 IP 地址和端口号(如果不是默认 22)没有写错。

scp: /path/to/destination: Not a directory

当你要拷贝一个目录时,忘记使用 -r 选项,或者目标路径不是一个已存在的目录。

  • 解决方案: 在源文件/目录后加上 -r 选项。

scp 是运维和开发人员必备的命令之一,记住它的核心用法和常用选项 (-r, -P, -p, -C),就能解决绝大多数文件传输问题,对于需要频繁同步和更高级控制需求的场景,可以学习并使用 rsync

分享:
扫描分享到社交APP
上一篇
下一篇