Linux常用命令 - scp【OpenSSH 安全文件拷贝】

简介

scp,全称 “secure copy” 即“安全拷贝”,scp 命令基于 SSH (Secure Shell) 协议,用于在 Linux 系统之间或 Linux 系统与本地计算机之间安全地传输文件。它通过加密数据传输过程,防止敏感信息在网络上被窃取,保证了文件传输的安全性。底层原理是利用 SSH 协议建立安全的连接,然后通过该连接进行文件复制。

使用方式

scp [-346ABCOpqRrsTv] [-c cipher] [-D sftp_server_path] [-F ssh_config] [-i identity_file] [-J destination] [-l limit] [-o ssh_option] [-P port] [-S program] source ...
    target

常用参数

  • -3:在两个远程主机之间复制文件时,数据会强制通过执行 scp 命令的本地主机进行中转传输。如果不使用此选项,数据将尝试在两个远程主机之间直接传输。注意,当使用旧版 SCP 协议时,此选项会为第二个远程主机启用批处理模式,因为 scp 无法同时询问两个远程主机的密码或口令。
  • -4:强制 scp 仅使用 IPv4 。
  • -6:强制 scp 仅使用 IPv6 。
  • -A:允许将 ssh-agent(1) 转发到远程系统,默认情况下不进行转发。
  • -B:使用批处理模式(避免询问密码或口令)。
  • -C:启用压缩。此选项将 -C 传递给 ssh(1) ,以启用数据传输过程中的压缩。
  • -c cipher:指定用于加密数据传输的加密算法。此选项会直接传递给 ssh(1)
  • -D sftp_server_path:当通过 -s 选项使用 SFTP 协议时,直接连接一个本地的 SFTP 服务器而不是通过 ssh(1) 连接一个远程的。该选项可能在调试客户端和服务器时比较有用。
  • -F ssh_config:指定一个备用的用户级 ssh 配置文件路径。此选项会直接传递给 ssh(1)
  • -i identity_file:指定用于公钥认证的身份文件(即私钥文件)的路径。此选项会直接传递给 ssh(1)
  • -J destination:通过一个或多个跳板机(Jump Host)连接到目标主机。它会首先建立到由 destination 指定的跳板机的 scp 连接,然后从跳板机建立到最终目标主机的 TCP 转发连接。你可以用逗号分隔指定多个跳板机。这是 ProxyJump 配置指令的一个快捷方式。此选项会直接传递给 ssh(1)
  • -l limit:限制使用的带宽,单位是 Kbit/s
  • -O:使用原始的 SCP 协议进行文件传输,而不是 SFTP 协议。在以下情况可能需要使用此选项:连接的服务器不支持 SFTP;为了向后兼容特定的文件名通配符模式;为了让旧版本的 SFTP 服务器能正确解析以 ~ 开头的路径。注意,此模式是默认的文件传输模式。
  • -o ssh_option:允许将 ssh_config(5) 手册页中定义的各种选项直接传递给底层的 ssh 命令。这在你需要使用 scp 命令本身没有独立命令行参数来对应的 ssh 配置时非常有用。关于这些选项的完整列表及其可能的值,请参考 ssh_config(5) 手册页。
  • -P port:指定连接到远程主机的端口号。注意,这个选项使用的是大写的 P,因为小写的 -p 选项已经被保留用于保留文件属性。
  • -p:保留源文件的修改时间、访问时间以及文件权限模式。
  • -q:安静模式:禁用进度显示条,同时也会抑制来自 ssh(1) 的警告和诊断信息。
  • -R:用于在两个远程主机之间进行文件复制。scp 会连接到源文件所在的主机,并在该主机上执行 scp 命令来完成复制。这要求源主机上的 scp 能够无需密码就认证连接到目标主机。
  • -r:递归复制整个目录及其内容。scp 在遍历目录树时会解析遇到的符号链接,复制符号链接所指向的文件而不是符号链接本身。
  • -S program:指定用于加密连接的程序。这个程序必须能够理解 ssh(1) 的选项。
  • -s:使用 SFTP 协议来替代原始的 scp 协议。
  • -T:禁用严格的文件校验。默认情况下,当从远程主机复制文件到本地目录时,scp 会检查接收到的文件名是否与命令行中请求的文件名匹配,以防止远程端发送意外或不需要的文件。由于不同操作系统和 Shell 对文件名通配符的解释方式不同,这种检查有时可能会导致需要的文件被拒绝。使用此选项会禁用这些检查,但代价是完全信任服务器不会发送意外的文件名。
  • -v:详细模式。开启此选项会使 scpssh(1) 输出详细的调试信息,包括连接、认证和配置过程。这对于排查问题非常有帮助。

返回值

  • 0:指令执行成功。
  • >0:指令执行失败。

参考示例

从本地复制文件到远程主机

scp localfile.txt user@remotehost:/path/to/destination/

使用 scp 时将本地文件写在前,远程路径写在后即可实现从本地复制指定文件到远程主机的功能。注意此时一般会需要输入远程主机的密码:

jay@ubuntu:~/test$ scp test.txt jay@192.168.2.110:/home/jay/test
jay@192.168.2.110's password: 
test.txt                                      100%    0     0.0KB/s   00:00    
jay@ubuntu:~/test$ 

从远程主机复制文件到本地

scp user@remotehost:/path/to/remote/file.txt /path/to/local/

将远程文件路径前置,本地路径跟随其后即可实现从远程主机复制文件到本地的功能:

jay@ubuntu:~/test$ scp jay@192.168.2.110:/home/jay/test/hello.txt ./
jay@192.168.2.110's password: 
hello.txt                                     100%   12    11.5KB/s   00:00    
jay@ubuntu:~/test$ ls
hello.txt  test.txt
jay@ubuntu:~/test$ 

复制目录及其内容到远程主机

scp -r localdir user@remotehost:/path/to/destination/

使用 -r 选项可以传输整个文件夹:

jay@ubuntu:~/test$ scp -r jay@192.168.2.110:/home/jay/test/code ./
jay@192.168.2.110's password: 
app                                           100%   16KB   1.0MB/s   00:00    
Makefile                                      100%  212    83.4KB/s   00:00    
b.h                                           100%  222   107.7KB/s   00:00    
a.c                                           100%  319   173.7KB/s   00:00    
a.h                                           100%  160    88.4KB/s   00:00    
a.o                                           100% 1632   481.5KB/s   00:00    
jay@ubuntu:~/test$ ls
code  hello.txt  test.txt
jay@ubuntu:~/test$ 

注意事项

  • 确保你有权限访问源文件和目标路径。
  • 如果远程主机使用了非标准 SSH 端口,需要使用 -P 参数指定端口。
  • 默认使用的原始 SCP 协议需要在远程用户的 Shell 环境中执行命令来完成通配符 glob(3) 模式匹配。这意味着你需要非常小心地引用那些对远程 Shell 有特殊含义的字符,例如各种引号字符本身,以避免 Shell 对其进行不期望的解释。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WKJay_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值