菜鸟科技网

Linux scp命令详解,如何高效安全传输文件?

scp 是一个在 Linux/Unix 系统下基于 SSH (Secure Shell) 协议进行安全远程文件拷贝的工具,它的特点是简单、直接、安全,因为它利用了 SSH 的加密通道来传输数据,避免了明文传输的风险。

Linux scp命令详解,如何高效安全传输文件?-图1
(图片来源网络,侵删)

基本语法

scp 的基本语法结构如下:

scp [选项] [源文件] [目标文件]

这里的“源文件”和“目标文件”可以有以下四种组合形式:

  1. 从本地拷贝到远程
    scp [选项] /path/to/local/file username@remote_host:/path/to/remote/directory
  2. 从远程拷贝到本地
    scp [选项] username@remote_host:/path/to/remote/file /path/to/local/directory
  3. 在两个远程主机之间拷贝(本地作为跳板)
    scp [选项] username1@host1:/path/to/file1 username2@host2:/path/to/directory2
  4. 目录拷贝
    scp [选项] -r /path/to/local/directory username@remote_host:/path/to/remote/directory

核心选项

scp 提供了许多有用的选项,以下是其中最常用和最重要的几个:

选项 全称 描述
-P port 指定远程主机连接的端口号。注意:这是大写的 P,因为小写的 -p 已经被 scp 用于“保留文件修改时间、访问时间和权限”了。
-p preserve 保留文件的元数据,包括修改时间、访问时间和权限,默认情况下不开启。
-r recursive 递归地拷贝整个目录,如果要拷贝目录,此选项是必需的。
-C compress 在传输过程中开启压缩,对于文本文件或不大的二进制文件,可以显著提高传输速度。
-l limit 限制带宽使用,单位为 Kbit/s。-l 800 表示限制使用 800 Kbit/s 的带宽,避免占用过多网络资源。
-i identity_file 指定一个私钥文件来连接远程主机(~/.ssh/id_rsa),这对于使用非默认密钥或特定密钥非常有用。
-v verbose 详细模式,显示整个连接过程的调试信息,如 SSH 密钥指纹、服务器指纹、数据传输统计等,在连接出现问题时非常有用。
-q quiet 安静模式,不显示进度条和警告信息。
-4 ipv4 强制使用 IPv4 地址。
-6 ipv6 强制使用 IPv6 地址。

常用场景实例

假设我们有以下环境:

Linux scp命令详解,如何高效安全传输文件?-图2
(图片来源网络,侵删)
  • 本地主机: local_pc (IP: 168.1.100)
  • 远程主机: remote_server (IP: 0.113.10, 用户名: ubuntu)

场景1:上传单个文件到远程服务器

将本地当前目录下的 report.txt 文件拷贝到远程服务器 remote_server/home/ubuntu/documents/ 目录下。

scp report.txt ubuntu@203.0.113.10:/home/ubuntu/documents/

执行后会提示你输入 ubuntu 用户的密码。

场景2:从远程服务器下载单个文件

将远程服务器上的 data.zip 文件下载到本地当前目录。

scp ubuntu@203.0.113.10:/home/ubuntu/data.zip .
  • 注意末尾的 ,代表当前本地目录。

场景3:上传整个目录

将本地当前目录下的 project_folder 文件夹递归地拷贝到远程服务器。

scp -r project_folder ubuntu@203.0.113.10:/home/ubuntu/
  • 必须使用 -r 选项

场景4:从远程服务器下载整个目录

将远程服务器上的 archive_folder 下载到本地当前目录。

scp -r ubuntu@203.0.113.10:/home/ubuntu/archive_folder .

场景5:指定SSH端口

如果远程服务器的SSH端口不是默认的 22,而是 2222

# 上传文件
scp -P 2222 report.txt ubuntu@203.0.113.10:/home/ubuntu/
# 下载文件
scp -P 2222 ubuntu@203.0.113.10:/home/ubuntu/data.zip .
  • 再次强调,-P 是大写的

场景6:使用SSH密钥进行免密登录

如果你已经配置了SSH密钥对(通过 ssh-keygen)并将公钥(~/.ssh/id_rsa.pub)添加到了远程服务器的 ~/.ssh/authorized_keys 文件中,你就可以使用 -i 指定私钥文件来实现免密登录。

# 上传文件
scp -i ~/.ssh/my_custom_key report.txt ubuntu@203.0.113.10:/home/ubuntu/
  • 如果不指定 -iscp 默认会使用 ssh 默认的私钥文件(通常是 ~/.ssh/id_rsa~/.ssh/id_dsa)。

场景7:限制传输速率

在拷贝一个大文件时,为了避免影响其他网络应用,可以限制带宽。

# 限制带宽为 1 Mbit/s (1000 Kbit/s)
scp -l 1000 large_file.iso ubuntu@203.0.113.10:/tmp/

场景8:保留文件属性

确保拷贝后的文件与原文件的修改时间和权限保持一致。

scp -p report.txt ubuntu@203.0.113.10:/home/ubuntu/

场景9:开启压缩传输

对于文本文件或压缩效果好的文件,开启压缩可以加快传输速度。

scp -C large_log_file.txt ubuntu@203.0.113.10:/var/log/

场景10:两个远程主机之间传输文件

假设你需要在 server1server2 之间传输文件,而你自己的 local_pc 可以访问这两台服务器。

# 将 server1 上的 file.txt 拷贝到 server2 的 /tmp/ 目录
# 你的 local_pc 会作为中间跳板
scp -r ubuntu@server1:/home/ubuntu/file.txt ubuntu@server2:/tmp/
  • 这种情况下,你的 local_pc 需要能无密码或通过密码登录到 server1server2

安全注意事项

  1. 密码明文传输风险:虽然 scp 本身是加密的,但在命令行中直接输入密码意味着你的密码可能会被记录在 Shell 的历史记录(~/.bash_history~/.zsh_history)中,对于自动化脚本,这是一个严重的安全隐患。
  2. 最佳实践:使用SSH密钥:为了安全和自动化,强烈建议使用 SSH公钥认证 而非密码认证,你可以通过 ssh-copy-id 命令轻松地将公钥推送到远程服务器。
    ssh-copy-id -i ~/.ssh/my_key.pub ubuntu@203.0.113.10

    这样,之后所有基于SSH的工具(包括 scp, ssh, sftp)都可以免密登录,更加安全和方便。

  3. 文件覆盖风险scp 在目标文件已存在时会直接覆盖,并且不会有任何确认提示,在执行拷贝操作前,请务必确认目标路径和文件名是否正确。

scp vs. rsync

scp 非常适合一次性、简单的文件拷贝任务,但如果你需要进行更复杂的同步操作,rsync (Remote Sync) 通常是更好的选择。

特性 scp rsync
功能 简单的文件/目录拷贝 功能强大的文件同步和备份工具
增量传输 不支持,每次都会完整传输所有文件。 支持,只传输源和目标之间有差异的部分,效率极高。
删除文件 不支持,无法删除目标端多余文件。 支持,可以删除目标端存在但源端不存在的文件(使用 --delete 选项)。
带宽控制 支持 (-l) 支持 (--bwlimit)
压缩 支持 (-C) 支持 (-z)
保留属性 支持 (-p) 支持 (-a-p)
进度显示 有详细的进度条
  • scp:当你只是想快速地把一个或几个文件从A点拷贝到B点,不关心后续的同步,并且不介意每次都完整传输。
  • rsync:当你需要做备份、保持两个目录内容完全同步、或者只传输文件变化的部分时,rsync 是无可替代的选择。

希望这份详细的 scp 命令指南能帮助你更好地使用它!

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