标签 scp 下的文章

在网络上文件传输可以通过各种不同的方式和协议来完成。远程复制文件最常用的协议是 RsyncSCPSFTP。在本文中,我们将了解什么是 SCP 以及如何在 Linux 和类 Unix 操作系统中使用 SCP 在本地和远程计算机之间安全地传输文件

什么是 SCP?

SCP,代表 安全复制 Secure Copy ,它是一个命令行程序,在 Linux 和类 Unix 操作系统中以安全的方式在本地和远程系统之间,或在两个远程系统之间复制文件和目录。

使用 scp 命令,你可以安全地复制文件或目录:

  • 从本地到远程系统
  • 从远程系统到本地
  • 在两个远程系统之间

使用 scp 命令传输数据时,文件和目录都是加密的。因此,即使网络被破坏,作恶者也无法获得任何有意义的数据。

SCP 是 openSSH 程序的一个组件,它使用 SSH 协议安全地传输文件。几乎所有现代 Linux 和 Unix 发行版都预装了 OpenSSH,所以不必费心安装它。

提醒一句:

根据 openSSH 开发人员的官方公告

scp 协议已经过时了,它不灵活且不易修复。我们建议使用更现代的协议,如 sftprsync 来代替。

参考 - https://lists.mindrot.org/pipermail/openssh-unix-dev/2019-March/037672.html

但是,大多数用户仍然更喜欢 SCP 协议。因为,SCP 处理远程文件传输比同行 SFTP 和 Rsync 更快。

另外,SCP 的工作原理与 cp 命令完全相同,而 rsync 则会判断源目录是否有结尾斜杠而出现不同的行为。看一看下面的命令:

  • rsync source destination/ - 将 source 目录复制到 destination 文件夹内。
  • rsync source/ destination/ - 将 source 目录的内容复制到 destination 文件夹中。

所以,你必须反复检查是否在路径中添加了斜杠。

我个人使用 Rsync 在两台主机之间复制大文件,使用 SCP 在网络上复制单个文件。

SCP 命令语法

SCP 的通用语法如下:

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

根据文件传输路径的不同,语法也会有所不同。这里我罗列了一些语法格式示例。

从本地复制一个文件到远程系统:

scp <options> SourceFile User@RemoteHost:RemotePath

类似的,从本地系统复制一个目录到远程系统,使用 -r 参数:

scp -r SourceDirectory User@RemoteHost:RemotePath

复制多个文件到远程系统:

scp <options> SourceFile1 SourceFile2 User@RemoteHost:RemotePath

远程系统复制文件到本地:

scp <options> User@RemoteHost:RemoteFilePath DestinationFile

远程系统复制目录到本地:

scp -r User@RemoteHost:RemoteDirectoryPath DestinationDirectory

在本地将文件在两个远程系统之间复制:

scp <options> User@RemoteHost1:RemoteFile1 User@RemoteHost2:RemotePath

注意,当你在两个远程系统之间复制文件时,流量不会通过本地系统。操作直接在两个远程系统之间进行。但是,你可以使用 -3 参数让流量经过你运行 scp 命令的系统。

从你的本地系统将一个远程系统的目录复制到另一个远程系统:

scp -r User@RemoteHost1:RemoteDirectory User@RemoteHost2:DestinationPath

SCP 命令参数

SCP 命令最常用的参数有:

  • -C:启用压缩。C 代表 压缩 Compression 。使用此参数时,数据传输速度会更快,因为数据是压缩的。SCP 将自动在源系统上压缩,并在目标系统上解压缩。
  • -c <cipher>c 代表 加密 Cipher 。默认情况下,SCP 使用 AES-128 加密方法对数据进行加密。你可以使用 -c 参数更改加密方法。
  • -i <identity_file>i 代表 身份 Identity 文件或私钥。如你所知,SSH 中使用基于密码或密钥的身份验证。如果希望在传输文件时使用基于密钥的身份验证,可以使用 -i 参数指定身份文件或私钥。
  • -l limitl 代表 限制 Limit 带宽。通过此参数,可以设置传输数据的最大带宽。它的单位是 Kbit/s
  • -F <ssh_config>:有时你可能需要使用不同的网络来连接到 Linux 系统,或你有一个代理服务器,这种情况下,你可以使用 -F 参数使用不同的 ssh_config 文件 File
  • -P portP 代表 端口 Port 。注意,这是大写的 P。默认情况下,SSH 使用端口 22。但出于安全原因,你可能已经更改了目标主机中的端口号。这种情况下,你应该使用 -P 参数显示指定新端口号。
  • -p:如果希望 保留 Preserve 原始文件的修改时间、访问时间和模式,你需要使用 -p 参数。注意是小写 p
  • -r 递归 Recursively 复制整个目录。
  • -BB 代表 批处理 Batch 模式。它用于在传输文件时选择批处理模式。可以防止询问密码。
  • -S program:用于加密连接的 程序 Program 名称。
  • -vv 代表 详细 Verbose 。当使用 -v 参数时,命令将会在终端屏幕上打印进度。你会看到文件传输时到底发生了什么。它在调试连接、身份验证和配置问题时非常有用。

SCP 有很多参数,你可以查看它的手册页来了解其他参数。让我们看一些有用的 scp 命令示例

开始前要记住的重要事项

  • scp 命令依赖于 ssh 进行安全的文件传输。因此,你必须有一个 ssh 密钥密码才能向远程系统进行身份验证。
  • 为了能传输文件,你必须对源文件有读权限,对目标位置有写权限
  • scp 命令在写入前不会检查目标位置。目标位置中具有相同名称的任何文件都将被覆盖而不通知
  • 为了能够区分本地和远程位置,使用冒号:)。
  • 传输大文件时,建议在 ScreenTmux 会话内启动任务。

在 Linux 中使用 SCP 传输文件

正如我所说,我们可以使用 scp 命令将文件或目录从本地复制到远程系统,反之亦然,或者在两台远程系统之间复制文件或目录。

1. 使用 SCP 从本地系统复制文件到远程系统

使用 scp 命令将文件从本地复制到远程系统,运行:

$ scp File1.txt [email protected]:/home/ostechnix/

示例输出:

[email protected]'s password: 
File1.txt                                                    100%  104   814.0KB/s   00:00

让我们分析一下上面的命令,看看每个参数都做了什么。

  • File1.txt - 源文件
  • ostechnix - 远程系统的用户名
  • 192.168.1.40 - 远程系统的 IP 地址
  • /home/ostechnix/ - 远程系统中的目标目录。这是我们想要传输源文件的绝对路径,如 File.txt

你还可以修改目标文件的名称。下面的命令将 File1.txt 传输到目的地,保存为 myfile.txt

$ scp File1.txt [email protected]:/home/ostechnix/myfile.txt

将文件从本地复制到远程系统

2. 使用 SCP 从本地系统复制多个文件到远程系统

使用 scp 命令将多个文件从本地系统传输到远程系统,运行:

$ scp File1.txt File2.txt [email protected]:/home/ostechnix/

示例输出:

[email protected]'s password: 
File1.txt                                                    100%  104   689.4KB/s   00:00    
File2.txt                                                    100%  496     6.3MB/s   00:00

从本地复制多个文件到远程系统

这里:

  • File1.txtFile2.txt - 源文件名
  • [email protected] - 远程系统的用户名和 IP 地址
  • /home/ostechnix - 目标文件的路径

如果文件具有相同的扩展名,你可以使用以下替代命令来实现相同的目标。

$ scp {File1,File2}.txt [email protected]:/home/ostechnix/

或者,

$ scp *.txt [email protected]:/home/ostechnix/

3. 使用 SCP 从本地到远程系统递归复制目录

递归地将整个目录(包括子目录及其内容)从本地复制到远程系统,使用 -r 参数。

$ scp -r Documents/ [email protected]:/home/ostechnix/

从本地复制目录到远程系统

上述命令将整个 Documents 目录包括其内容复制到目标系统。

其中,

  • -r - 递归复制文件和目录,包括子目录及其内容
  • Documents - 源目录名称
  • [email protected] - 远程系统的用户名和 IP 地址
  • /home/ostechnix - 目标目录的路径

4. 用 SCP 将文件从远程系统传输到本地

还记得我们从本地系统复制了 File1.txt 到远程系统,让我们把它复制回本地。

使用 scp 命令从远程系统复制文件到本地,运行:

$ scp [email protected]:/home/ostechnix/File1.txt Downloads/

其中

  • [email protected] - 远程系统的用户名和 IP 地址
  • /home/ostechnix/File.txt - 远程系统文件的绝对路径
  • Downloads - 本地保存复制文件的位置

从远程系统传输文件到本地

5. 使用 SCP 将多个文件从远程系统传输到本地

将多个文件从远程系统复制到本地,在花括号内注明文件的绝对路径,如下所示:

$ scp [email protected]:/home/ostechnix/\{File1.txt,File2.txt\} Downloads/

将多个文件从远程系统传输到本地

上述命令将从远程系统的 /home/ostechnix/ 目录中复制 File1.txtFile2.txt 到本地的 Downloads 目录中。

注意,花括号内的逗号后面没有空格

6. 从远程系统递归复制目录到本地

使用 scp 从远程系统递归复制整个目录(包括子目录及其内容)到本地系统,使用 -r 参数。

$ scp -r [email protected]:/home/ostechnix/Documents Downloads/

上述命令将从远程系统将整个 Documents 目录复制到本地的 Downloads 目录。

7. 使用 SCP 在两台远程计算机之间复制文件

使用 scp 命令将文件从一个远程系统直接复制到另一个远程系统,运行:

$ scp [email protected]:/home/senthil/File1.txt [email protected]:/home/kumar/

它会要求你输入两个远程系统的密码:

其中,

  • [email protected] - 文件源端远程系统的用户名和 IP 地址
  • /home/senthil/File1.txt - 复制的文件名及其位置
  • [email protected] - 复制文件到目标端的用户名和 IP 地址
  • /home/kumar - 在目标端上保存复制文件的位置

上述命令将从远程主机 192.168.1.40 复制 /home/senthil/File1.txt192.168.1.20 上的 /home/kumar/ 目录。

在这种方法中,数据将直接从一个远程系统传输到另一个远程系统。如果你想通过本地机器路由流量,使用 -3 参数,如下所示:

$ scp -3 [email protected]:/home/senthil/File1.txt [email protected]:/home/kumar/

8. 使用 SCP 复制文件时启用压缩

到目前为止,我们在没有压缩的情况下传输了文件。现在我们将使用 -C 参数在传输文件时启用压缩。

$ scp -C File1.txt [email protected]:/home/ostechnix/

-C 参数将在源端启用压缩,并在目标端自动解压数据。

通过启用压缩,可以显著提高文件复制或传输速度。

9. 使用 SCP 传输文件时限制带宽

我们可以使用 -l 参数限制带宽。注意,最大带宽单位为 Kbits/s。1 Byte = 8 bit。因此,如果你想将带宽限制在 200KB/s,-l 的值将是 1600(200*8)。

$ scp -l 1600 File1.txt [email protected]:/home/ostechnix/

这在传输大文件时非常有用,可以防止 SCP 限制带宽。

10. 使用 SCP 复制文件时使用不同端口

作为系统管理员,出于安全原因,你可能在远程服务器上 更改了 SSH 协议的默认端口。这种情况下,你可以在传输文件时使用 -P 参数指定端口号。注意:大写的 P

$ scp -P 2022 File1.txt [email protected]:/home/ostechnix/

11. 使用 SCP 复制文件时使用不同的加密方法

默认情况下,SCP 使用 AES-128 对文件进行加密。如果你想使用不同的加密方法,使用 c 参数。

例如,如果你想使用 3des-cbc 加密方法,命令如下所示:

$ scp -c 3des-cbc File1.txt [email protected]:/home/ostechnix/

要查看支持的密码列表,执行:

$ ssh -Q cipher localhost | paste -d, -s -

示例输出:

3des-cbc,aes128-cbc,aes192-cbc,aes256-cbc,[email protected],aes128-ctr,aes192-ctr,aes256-ctr,[email protected],[email protected],[email protected]

12. 在详细模式下使用 SCP 复制文件

如果你想知道使用 scp 复制文件时幕后发生了什么,你可以使用 -v 参数。使用详细模式传输文件时,终端上会显示执行 scp 命令执行的每一步过程。这在故障排除时很方便。

$ scp -v File1.txt [email protected]:/home/ostechnix/

在详细模式下发送文件时,你将看到大量输出,如下所示:

在详细模式下使用 SCP 复制文件

13. 在安静模式下使用 SCP 传输文件

我们可以使用 -q 参数在安静模式下传输文件。在安静模式下共享文件时,不会在输出中显示进度、警告或诊断信息。

$ scp -q File1.txt [email protected]:/home/ostechnix/

14. 使用 SCP 传输文件时保留文件属性

使用 -p 参数可以保留文件修改时间、访问时间和模式等文件属性。注意,这是小写的 p

$ scp -p File1.txt [email protected]:/home/ostechnix/

15. 使用 SCP 复制文件时使用身份文件

SSH 同时支持基于密码和密钥的身份验证。密钥是 Linux 环境中使用最广泛的身份验证方法。

如果你想在传输文件时使用基于密钥的身份验证,使用 -i 参数指定身份文件或私钥。

$ scp -i my_private_key.pem File1.txt [email protected]:/home/ostechnix/

16. 使用不同的 ssh 配置文件

在某些情况下,你需要使用不同的网络来连接到 Linux 系统,或你有一个代理服务器。这在情况下,你可以配合 -F 参数使用不同的 ssh_config 文件。

$ scp -F /home/ostechnix/my_ssh_config File1.txt [email protected]:/home/ostechnix/

17. 使用 IPv4 或 IPv6 复制文件

在复制文件时,我们可以强制 SCP 只使用 IPv4 或 IPv6 地址。IPv4 网络添加 -4 参数,IPv6 网络添加 -6 参数可以实现这一点。

$ scp -6 File1.txt [email protected]:/home/ostechnix/

常见问题

问题 1:什么是 SCP?

SCP 是一个命令行程序,旨在将文件和目录从本地系统安全地传输到远程系统,反之亦然,或者直接在两个远程系统之间传输。

问题 2: 如何使用 SCP 将文件从本地复制到远程计算机?

将文件从本地复制到远程系统,命令如下:

scp SourceFile.txt User@RemoteHost:/some/remote/directory

问题 3:如何递归复制文件和目录?

递归复制包含子目录的目录,使用 -r 参数:

scp -r /some/local/directory User@RemoteHost:/some/remote/directory

问题 4:使用 SCP 可以传输多个文件吗?

当然,只要用空格分隔源文件名即可。

从本地复制多个文件到远程:

scp file1.txt file2.txt file3.txt User@RemoteHost:/some/remote/directory
scp {file1,file2,file3}.txt User@RemoteHost:/some/remote/directory
scp *.txt User@RemoteHost:/some/remote/directory

从远程复制多个文件到本地:

scp User@RemoteHost:/some/remote/directory/\{file1.txt,file2.txt,file3.txt\} /some/local/directory

从一个远程系统复制多个文件到另一个远程系统:

$ scp User@RemoteHost1:/some/remote/directory/\{file1.txt,file2.txt,file3.txt\} User@RemoteHost2:/some/remote/directory/

问题 5:如何传输目录下的所有文件?

传输整个目录,首先进入该目录:

cd dir_name

然后,

scp *.txt User@RemoteHost:/some/remote/directory

问题 6:可以压缩文件吗?

当然。使用 -C 压缩文件。文件会在源端压缩,在目标端自动解压缩。

scp -C /some/large/file User@RemoteHost:/some/remote/directory

问题 7:可以保留文件属性吗?

保留原始文件的修改时间、访问时间和模式等文件属性,使用 -p 参数。

scp -p file.txt User@RemoteHost:/some/remote/directory

问题 8: 可以使用其他端口吗?

当然。SCP 配合 -P 参数允许你使用其他端口。

scp -P 2022 file.txt User@RemoteHost:/some/remote/directory

问题 9: 可以使用不同的加密方法吗?

当然。使用 -c 参数。

scp -c 3des-cbc User@RemoteHost:/some/remote/directory

问题 10: 如何列出 SSH 支持的加密方法?

使用以下命令查看 SSH 和 SCP 支持的加密方法列表:

ssh -Q cipher localhost | paste -d, -s -

问题 11:SCP 真的安全吗?

当然,它用起来是完全安全的。SCP 和 openSSH 使用相同的 SSH 机制。传输的数据在源端加密,目标端解密。

问题 12:可以从 Windows 系统传输文件到 Linux 吗?

当然。使用 PSCP 程序将文件从 windows 传输到 Linux 平台,你也可以使用 WinSCP

总结

在这篇全面指南中,我们了解了什么是 SCP,以及如何在 Linux 中使用 SCP 安全地传输文件,其中包括 17 个 SCP 命令示例,另外还回答了关于 SCP 的常见问题。

无论你是 Linux 管理人员、开发人员还是普通用户,你都会面临某个时候将文件复制到远程系统或从远程系统复制文件的情况,知道如何使用 SCP 安全地复制文件将是非常有用的。


via: https://ostechnix.com/securely-transfer-files-with-scp-in-linux/

作者:sk 选题:lkxed 译者:MjSeven 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

如果你正在寻找一种快速的从你的 Windows 计算机传输文件到你的 Linux 计算机的方法,那么开源的 WinSCP 实用程序会使其很容易地通过网络传输文件或文件夹。

有时,你需要通过文件传输文件。有很多文件共享服务,但是大多数的共享服务都要求你发送你的文件到互联网上。当两台计算机并排在一起或在一栋建筑物中时,通过互联网传输文件,这似乎看起来绕了很远的路(更不用说隐私问题)。开源的 WinSCP 实用程序会使其很轻易地通过网络将一个文件或一个文件夹从你的 Windows 计算机传输到你的 Linux 计算机。

IP 地址

在你可以传输之前,你必须知道目标计算机的 IP 地址或完全限定域名。假设它是一台在你的同一个网络上的计算机,并且你没有运行 DNS 服务器来解析计算机名称,你可以在 Linux 计算机上使用 ip 命令来找到目标 IP 地址:

[linux]$ ip addr show |grep 'inet '
inet 127.0.0.1/8 scope host lo  
inet 192.168.1.23/24 brd 10.0.1.255 scope global noprefixroute eth0

127.0.0.1 是一个 环回地址 loopback address ,计算机仅使用它来自我通信,因此在这个示例中,正确的地址是 192.168.1.23 。在你的系统中,IP 地址可能会看起来有所不同。如果你不确定哪个是哪个,你可以逐个尝试到你找到正确的 IP 地址 (然后,在一些地方写下来!)

或者,你可以查找你的路由器设置,它列出了所有通过 DHCP 分配的地址。

防火墙和地址

WinSCP 命令使用 OpenSSH 协议,因此,你的 Linux 计算机必需运行 OpenSSH 服务器软件,并且你的 Linux 计算机的防火墙必需允许 SSH 通信。

如果你不确定你的 Linux 机器是否在运行 SSH ,那么在 Linux 机器的终端上运行这个命令:

[linux]$ sudo systemctl enable --now sshd

为确保你的防火墙允许 SSH 通信,运行这个命令:

[linux]$ sudo firewall-cmd --add-servicessh--permanent

关于 Linux 上的防火墙的更多信息,阅读 增强 Linux 防火墙

使用 WinSCP

WinSCP 是一款针对微软 Windows 的开源 SSH 文件传输应用程序。为使用它,你必须先 下载安装 它。

在你安装完成后,打开 WinSCP ,并在 “ 文件协议 File Protocol ” 字段中选择 “SCP” 选项。

在 “ 主机名称 Host name ” 字段中添加你的 Linux 计算机的 IP 地址或 DNS 名称,并在 “ 端口号 Port number ” 字段中输入 22 。针对该 Linux 计算机,输入你的用户名称和密码,然后单击 WinSCP 窗口底部的 “ 登录 Login ” 按钮。

Image of the WinSCP login window.

验证你是否获取了登录 Linux 计算机的身份授权。在验证成功后,你的 Linux 计算机的 IP 地址或 DNS 名称将显示在窗口的顶部。

Image of a WinSCP window showing where IP adress is located.

现在,你可以从左侧的 Windows 面板中拖拽一个文件(如示例,我使用 winscp-test.txt 文件)到右侧的目标 Linux 计算机目标,接下来文件会传输。

Image of drag and drop window in WinSCP.

或者,你可以在左侧的面板中右键单击一个文件,然后上传它到右侧的远程目标的面板。

Image of a right click option to upload files in WinSCP.

验证副本

打开一个 Linux 终端,然后使用 ls 命令来查看已传输的 winscp-test.txt 文件。在我的示例中,它出现在我的主目录, /home/sysadmin

$ ls
Desktop
Documents
Downloads
Music
Pictures
pscp-test.txt[...]

你已经通过网络成功地将一个文件从一台 Windows 计算机传输到一台 Linux 计算机!

当然,你也可以使用类似上述的技术,将文件和文件夹从一台 Linux 计算机传输到一台 Windows 计算机。

远程复制

使用强大的开源 WinSCP 应用程序,你可以访问在你家中或工作场所的任意一台计算机、你拥有账户的服务器、甚至是移动设备、边缘设备、物联网设备。使用这个极好的工具来传输文件就像你在本地目录下将一个文件复制到另一个本地目录一样容易!


via: https://opensource.com/article/22/11/transfer-files-folders-windows-linux-winscp

作者:Paul 选题:lkxed 译者:robsean 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

SSH 8.0 预发布公告中,OpenSSH 项目表示,他们认为 scp 协议已经过时,不灵活,而且不容易修复,然后他们继而推荐使用 sftprsync 来进行文件传输。

然而,很多用户都是从小用着 scp 命令长大的,所以对 rsync 并不熟悉。此外,rsync 可以做的事情也远不止复制文件,这可能会给菜鸟们留下复杂和难以掌握的印象。尤其是,scp 命令的标志大体上可以直接对应到 cp 命令的标志,而 rsync 命令的标志却和它大相径庭。

本文将为熟悉 scp 的人提供一个介绍和过渡的指南。让我们跳进最常见的场景:复制文件和复制目录。

复制文件

对于复制单个文件而言,scprsync 命令实际上是等价的。比方说,你需要把 foo.txt 传到你在名为 server 的服务器上的主目录下:

$ scp foo.txt me@server:/home/me/

相应的 rsync 命令只需要输入 rsync 取代 scp

$ rsync foo.txt me@server:/home/me/

复制目录

对于复制目录,就有了很大的分歧,这也解释了为什么 rsync 会被认为比 scp 更复杂。如果你想把 bar 目录复制到 server 服务器上,除了指定 ssh 信息外,相应的 scp 命令和 cp 命令一模一样。

$ scp -r bar/ me@server:/home/me/

对于 rsync,考虑的因素比较多,因为它是一个比较强大的工具。首先,我们来看一下最简单的形式:

$ rsync -r bar/ me@server:/home/me/

看起来很简单吧?对于只包含目录和普通文件的简单情况,这就可以了。然而,rsync 更在意发送与主机系统中一模一样的文件。让我们来创建一个稍微复杂一些,但并不罕见的例子:

# 创建多级目录结构
$ mkdir -p bar/baz
# 在其根目录下创建文件
$ touch bar/foo.txt
# 现在创建一个符号链接指回到该文件
$ cd bar/baz
$ ln -s ../foo.txt link.txt
# 返回原位置
$ cd -

现在我们有了一个如下的目录树:

bar
├── baz
│   └── link.txt -> ../foo.txt
└── foo.txt

1 directory, 2 files

如果我们尝试上面的命令来复制 bar,我们会注意到非常不同的(并令人惊讶的)结果。首先,我们来试试 scp

$ scp -r bar/ me@server:/home/me/

如果你 ssh 进入你的服务器,看看 bar 的目录树,你会发现它和你的主机系统有一个重要而微妙的区别:

bar
├── baz
│   └── link.txt
└── foo.txt

1 directory, 2 files

请注意,link.txt 不再是一个符号链接,它现在是一个 foo.txt 的完整副本。如果你习惯于使用 cp,这可能会是令人惊讶的行为。如果你尝试使用 cp -r 复制 bar 目录,你会得到一个新的目录,里面的符号链接和 bar 的一样。现在如果我们尝试使用之前的 rsync 命令,我们会得到一个警告:

$ rsync -r bar/ me@server:/home/me/
skipping non-regular file "bar/baz/link.txt"

rsync 警告我们它发现了一个非常规文件,并正在跳过它。因为你没有告诉它可以复制符号链接,所以它忽略了它们。rsync 在手册中有一节“符号链接”,解释了所有可能的行为选项。在我们的例子中,我们需要添加 -links 标志:

$ rsync -r --links bar/ me@server:/home/me/

在远程服务器上,我们看到这个符号链接是作为一个符号链接复制过来的。请注意,这与 scp 复制符号链接的方式不同。

bar/
├── baz
│   └── link.txt -> ../foo.txt
└── foo.txt

1 directory, 2 files

为了省去一些打字工作,并利用更多的文件保护选项,在复制目录时可以使用归档标志 -archive(简称 -a)。该归档标志将做大多数人所期望的事情,因为它可以实现递归复制、符号链接复制和许多其他选项。

$ rsync -a bar/ me@server:/home/me/

如果你感兴趣的话,rsync 手册页有关于存档标志的深入解释。

注意事项

不过,使用 rsync 有一个注意事项。使用 scp 比使用 rsync 更容易指定一个非标准的 ssh 端口。例如,如果 server 使用 8022 端口的 SSH 连接,那么这些命令就会像这样:

$ scp -P 8022 foo.txt me@server:/home/me/

而在使用 rsync 时,你必须指定要使用的“远程 shell”命令,默认是 ssh。你可以使用 -e 标志来指定。

$ rsync -e 'ssh -p 8022' foo.txt me@server:/home/me/

rsync 会使用你的 ssh 配置;但是,如果你经常连接到这个服务器,你可以在你的 ~/.ssh/config 文件中添加以下代码。这样你就不需要再为 rsyncssh 命令指定端口了!

Host server
    Port 8022

另外,如果你连接的每一台服务器都在同一个非标准端口上运行,你还可以配置 RSYNC_RSH 环境变量。

为什么你还是应该切换到 rsync?

现在我们已经介绍了从 scp 切换到 rsync 的日常使用案例和注意事项,让我们花一些时间来探讨一下为什么你可能想要使用 rsync 的优点。很多人在很久以前就已经开始使用 rsync 了,就是因为这些优点。

即时压缩

如果你和服务器之间的网络连接速度较慢或有限,rsync 可以花费更多的 CPU 处理能力来节省网络带宽。它通过在发送数据之前对数据进行即时压缩来实现。压缩可以用 -z 标志来启用。

差量传输

rsync 也只在目标文件与源文件不同的情况下复制文件。这可以在目录中递归地工作。例如,如果你拿我们上面的最后一个 bar 的例子,并多次重新运行那个 rsync 命令,那么在最初的传输之后就不会有任何传输。如果你知道你会重复使用这些命令,例如备份到 U 盘,那么使用 rsync 即使是进行本地复制也是值得的,因为这个功能可以节省处理大型数据集的大量的时间。

同步

顾名思义,rsync 可以做的不仅仅是复制数据。到目前为止,我们只演示了如何使用 rsync 复制文件。如果你想让 rsync 把目标目录变成源目录的样子,你可以在 rsync 中添加删除标志 -delete。这个删除标志使得 rsync 将从源目录中复制不存在于目标目录中的文件,然后它将删除目标目录中不存在于源目录中的文件。结果就是目标目录和源目录完全一样。相比之下,scp 只会在目标目录下添加文件。

结论

对于简单的使用情况,rsync 并不比老牌的 scp 工具复杂多少。唯一显著的区别是在递归复制目录时使用 -a 而不是 -r。然而,正如我们看到的,rsync-a 标志比 scp-r 标志更像 cp-r 标志。

希望通过这些新命令,你可以加快你的文件传输工作流程。


via: https://fedoramagazine.org/scp-users-migration-guide-to-rsync/

作者:chasinglogic 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

SCP( 安全复制 Secure Copy )是 Linux 和 Unix 之类的系统中的命令行工具,用于通过网络安全地跨系统传输文件和目录。当我们使用 scp 命令将文件和目录从本地系统复制到远程系统时,则在后端与远程系统建立了 ssh 连接。换句话说,我们可以说 scp 在后端使用了相同的 SSH 安全机制,它需要密码或密钥进行身份验证。

在本教程中,我们将讨论 14 个有用的 Linux scp 命令示例。

scp 命令语法:

# scp <选项> <文件或目录> 用户名@目标主机:/<文件夹>

# scp <选项> 用户名@目标主机:/文件 <本地文件夹>

scp 命令的第一个语法演示了如何将文件或目录从本地系统复制到特定文件夹下的目标主机。

scp 命令的第二种语法演示了如何将目标主机中的文件复制到本地系统中。

下面列出了 scp 命令中使用最广泛的一些选项,

  • -C 启用压缩
  • -i 指定识别文件或私钥
  • -l 复制时限制带宽
  • -P 指定目标主机的 ssh 端口号
  • -p 复制时保留文件的权限、模式和访问时间
  • -q 禁止 SSH 警告消息
  • -r 递归复制文件和目录
  • -v 详细输出

现在让我们跳入示例!

示例:1)使用 scp 将文件从本地系统复制到远程系统

假设我们要使用 scp 命令将 jdk 的 rpm 软件包从本地 Linux 系统复制到远程系统(172.20.10.8),请使用以下命令,

[root@linuxtechi ~]$ scp jdk-linux-x64_bin.rpm root@linuxtechi:/opt
root@linuxtechi's password:
jdk-linux-x64_bin.rpm                          100%   10MB  27.1MB/s   00:00
[root@linuxtechi ~]$

上面的命令会将 jdk 的 rpm 软件包文件复制到 /opt 文件夹下的远程系统。

示例:2)使用 scp 将文件从远程系统复制到本地系统

假设我们想将文件从远程系统复制到本地系统下的 /tmp 文件夹,执行以下 scp 命令,

[root@linuxtechi ~]$ scp root@linuxtechi:/root/Technical-Doc-RHS.odt /tmp
root@linuxtechi's password:
Technical-Doc-RHS.odt                         100% 1109KB  31.8MB/s   00:00
[root@linuxtechi ~]$ ls -l /tmp/Technical-Doc-RHS.odt
-rwx------. 1 pkumar pkumar 1135521 Oct 19 11:12 /tmp/Technical-Doc-RHS.odt
[root@linuxtechi ~]$

示例:3)使用 scp 传输文件时的详细输出(-v)

scp 命令中,我们可以使用 -v 选项启用详细输出。使用详细输出,我们可以轻松地发现后台确切发生了什么。这对于调试连接、认证和配置等问题非常有用。

root@linuxtechi ~]$ scp -v jdk-linux-x64_bin.rpm root@linuxtechi:/opt
Executing: program /usr/bin/ssh host 172.20.10.8, user root, command scp -v -t /opt
OpenSSH_7.8p1, OpenSSL 1.1.1 FIPS  11 Sep 2018
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Reading configuration data /etc/ssh/ssh_config.d/05-redhat.conf
debug1: Reading configuration data /etc/crypto-policies/back-ends/openssh.config
debug1: /etc/ssh/ssh_config.d/05-redhat.conf line 8: Applying options for *
debug1: Connecting to 172.20.10.8 [172.20.10.8] port 22.
debug1: Connection established.
…………
debug1: Next authentication method: password
root@linuxtechi's password:

示例:4)将多个文件传输到远程系统

可以使用 scp 命令一次性将多个文件复制/传输到远程系统,在 scp 命令中指定多个文件,并用空格隔开,示例如下所示

[root@linuxtechi ~]$ scp install.txt index.html jdk-linux-x64_bin.rpm root@linuxtechi:/mnt
root@linuxtechi's password:
install.txt                                      100%    0     0.0KB/s   00:00
index.html                                       100%   85KB   7.2MB/s   00:00
jdk-linux-x64_bin.rpm                            100%   10MB  25.3MB/s   00:00
[root@linuxtechi ~]$

示例:5)在两个远程主机之间传输文件

使用 scp 命令,我们可以在两个远程主机之间复制文件和目录,假设我们有一个可以连接到两个远程 Linux 系统的本地 Linux 系统,因此从我的本地 Linux 系统中,我可以使用 scp 命令在这两个系统之间复制文件,

命令语法:

# scp 用户名@远程主机1:/<要传输的文件> 用户名@远程主机2:/<文件夹>

示例如下:

# scp root@linuxtechi:~/backup-Oct.zip root@linuxtechi:/tmp
# ssh root@linuxtechi "ls -l /tmp/backup-Oct.zip"
-rwx------. 1 root root 747438080 Oct 19 12:02 /tmp/backup-Oct.zip

示例:6)递归复制文件和目录(-r)

scp 命令中使用 -r 选项将整个目录从一个系统递归地复制到另一个系统,示例如下所示:

[root@linuxtechi ~]$ scp -r Downloads root@linuxtechi:/opt

使用以下命令验证 Downloads 文件夹是否已复制到远程系统,

[root@linuxtechi ~]$ ssh root@linuxtechi "ls -ld /opt/Downloads"
drwxr-xr-x. 2 root root 75 Oct 19 12:10 /opt/Downloads
[root@linuxtechi ~]$

示例:7)通过启用压缩来提高传输速度(-C)

scp 命令中,我们可以通过使用 -C 选项启用压缩来提高传输速度,它将自动在源主机上启用压缩并在目标主机上解压缩。

root@linuxtechi ~]$ scp -r -C Downloads root@linuxtechi:/mnt

在以上示例中,我们正在启用压缩的情况下传输下载目录。

示例:8)复制时限制带宽(-l)

scp 命令中使用 -l 选项设置复制时对带宽使用的限制。带宽以 Kbit/s 为单位指定,示例如下所示:

[root@linuxtechi ~]$ scp -l 500 jdk-linux-x64_bin.rpm  root@linuxtechi:/var

示例:9)在 scp 时指定其他 ssh 端口(-P)

在某些情况下,目标主机上的 ssh 端口会更改,因此在使用 scp 命令时,我们可以使用 -P 选项指定 ssh 端口号。

[root@linuxtechi ~]$ scp -P 2022 jdk-linux-x64_bin.rpm  root@linuxtechi:/var

在上面的示例中,远程主机的 ssh 端口为 “2022”。

示例:10)复制时保留文件的权限、模式和访问时间(-p)

从源复制到目标时,在 scp 命令中使用 -p 选项保留权限、访问时间和模式。

[root@linuxtechi ~]$ scp -p jdk-linux-x64_bin.rpm  root@linuxtechi:/var/tmp
jdk-linux-x64_bin.rpm                            100%   10MB  13.5MB/s   00:00
[root@linuxtechi ~]$

示例:11)在 scp 中以安静模式传输文件(-q)

scp 命令中使用 -q 选项可禁止显示 ssh 的传输进度、警告和诊断消息。示例如下所示:

[root@linuxtechi ~]$ scp -q -r Downloads root@linuxtechi:/var/tmp
[root@linuxtechi ~]$

示例:12)在传输时使用 scp 中的识别文件(-i)

在大多数 Linux 环境中,首选基于密钥的身份验证。在 scp 命令中,我们使用 -i 选项指定识别文件(私钥文件),示例如下所示:

[root@linuxtechi ~]$ scp -i my_key.pem -r Downloads root@linuxtechi:/root

在上面的示例中,my_key.pem 是识别文件或私钥文件。

示例:13)在 scp 中使用其他 ssh\_config 文件(-F)

在某些情况下,你使用不同的网络连接到 Linux 系统,可能某些网络位于代理服务器后面,因此在这种情况下,我们必须具有不同的 ssh_config 文件。

通过 -F 选项在 scp 命令中指定了不同的 ssh_config 文件,示例如下所示:

[root@linuxtechi ~]$ scp -F /home/pkumar/new_ssh_config -r Downloads root@linuxtechi:/root
root@linuxtechi's password:
jdk-linux-x64_bin.rpm                     100%   10MB  16.6MB/s   00:00
backup-Oct.zip                            100%  713MB  41.9MB/s   00:17
index.html                                100%   85KB   6.6MB/s   00:00
[root@linuxtechi ~]$

示例:14)在 scp 命令中使用其他加密方式(-c)

默认情况下,scp 使用 AES-128 加密方式来加密文件。如果你想在 scp 命令中使用其他加密方式,请使用 -c 选项,后接加密方式名称。

假设我们要在用 scp 命令传输文件时使用 3des-cbc 加密方式,请运行以下 scp 命令:

[root@linuxtechi ~]# scp -c 3des-cbc -r Downloads root@linuxtechi:/root

使用以下命令列出 sshscp 支持的加密方式:

[root@linuxtechi ~]# ssh -Q cipher localhost | paste -d , -s -
3des-cbc,aes128-cbc,aes192-cbc,aes256-cbc,root@linuxtechi,aes128-ctr,aes192-ctr,aes256-ctr,root@linuxtechi,root@linuxtechi,root@linuxtechi
[root@linuxtechi ~]#

以上就是本教程的全部内容,要获取有关 scp 命令的更多详细信息,请参考其手册页。请在下面的评论部分中分享你的反馈和评论。


via: https://www.linuxtechi.com/scp-command-examples-in-linux/

作者:Pradeep Kumar 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Linux 本就有 scprsync 可以完美地完成这个任务。然而我们今天还是想试点新东西。同时我们也想鼓励那些使用不同的理论和新技术开发新东西的开发者。

我们也写过其他很多有关这个主题的文章,你可以点击下面的链接访问这些内容。

它们分别是 OnionShareMagic WormholeTransfer.sh 和 ffsend。

什么是 dcp?

dcp 可以在不同主机之间使用 Dat 对等网络复制文件。

dcp 被视作一个像是 scp 这样工具的替代品,而无需在主机间进行 SSH 授权。

这可以让你在两个主机间传输文件时,无需操心所述主机之间互相访问的细节,以及这些主机是否使用了 NAT。

dcp 零配置、安全、快速、且是 P2P 传输。这并不是一个商用软件,使用产生的风险将由使用者自己承担。

什么是 Dat 协议

Dat 是一个 P2P 协议,是一个致力于下一代 Web 的由社区驱动的项目。

dcp 如何工作

dcp 将会为指定的文件或者文件夹创建一个 dat 归档,并生成一个公开密钥,使用这个公开密钥可以让其他人从另外一台主机上下载上面的文件。

使用网络共享的任何数据都使用该归档的公开密钥加密,也就是说文件的接收权仅限于那些拥有该公开密钥的人。

dcp 使用案例

  • 向多个同事发送文件 —— 只需要告诉他们生成的公开密钥,然后他们就可以在他们的机器上收到对应的文件了。
  • 无需设置 SSH 授权就可以在你本地网络的两个不同物理机上同步文件。
  • 无需压缩文件并把文件上传到云端就可以轻松地发送文件。
  • 当你有 shell 授权而没有 SSH 授权时也可以复制文件到远程服务器上。
  • 在没有很好的 SSH 支持的 Linux/macOS 以及 Windows 系统之间分享文件。

如何在 Linux 上安装 NodeJS & npm?

dcp 是用 JavaScript 写成的,所以在安装 dcp 前,需要先安装 NodeJS。在 Linux 上使用下面的命令安装 NodeJS。

Fedora 系统,使用 DNF 命令 安装 NodeJS & npm。

$ sudo dnf install nodejs npm

Debian/Ubuntu 系统,使用 APT-GET 命令 或者 APT 命令 安装 NodeJS & npm。

$ sudo apt install nodejs npm

Arch Linux 系统,使用 Pacman 命令 安装 NodeJS & npm。

$ sudo pacman -S nodejs npm

RHEL/CentOS 系统,使用 YUM 命令 安装 NodeJS & npm。

$ sudo yum install epel-release
$ sudo yum install nodejs npm

openSUSE Leap 系统,使用 Zypper 命令 安装 NodeJS & npm。

$ sudo zypper nodejs6

如何在 Linux 上安装 dcp?

在安装好 NodeJS 后,使用下面的 npm 命令安装 dcp

npm 是一个 JavaScript 的包管理器。它是 JavaScript 的运行环境 Node.js 的默认包管理器。

# npm i -g dat-cp

如何通过 dcp 发送文件?

dcp 命令后跟你想要传输的文件或者文件夹。而且无需注明目标机器的名字。

# dcp [File Name Which You Want To Transfer]

在你运行 dcp 命令时将会为传送的文件生成一个 dat 归档。一旦执行完成将会在页面底部生成一个公开密钥。(LCTT 译注:此处并非非对称加密中的公钥/私钥对,而是一种公开的密钥,属于对称加密。)

如何通过 dcp 接收文件

在远程服务器上输入公开密钥即可接收对应的文件或者文件夹。

# dcp [Public Key]

以递归形式复制目录。

# dcp [Folder Name Which You Want To Transfer] -r

下面这个例子我们将会传输单个文件。

上述文件传输的输出。

如果你想传输不止一个文件,使用下面的格式。

上述文件传输的输出。

递归复制文件夹。

上述文件夹传输的输出。

这种方式下你只能够下载一次文件或者文件夹,不可以多次下载。这也就意味着一旦你下载了这些文件或者文件夹,这个链接就会立即失效。

也可以在手册页查看更多的相关选项。

# dcp --help

via: https://www.2daygeek.com/dcp-dat-copy-secure-way-to-transfer-files-between-linux-systems/

作者:Vinoth Kumar 选题:lujun9972 译者:dianbanjiu 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

由于诸如电源故障、网络故障或用户干预等各种原因,使用 scp 命令通过 SSH 复制的大型文件可能会中断、取消或损坏。有一天,我将 Ubuntu 16.04 ISO 文件复制到我的远程系统。不幸的是断电了,网络连接立即断了。结果么?复制过程终止!这只是一个简单的例子。Ubuntu ISO 并不是那么大,一旦电源恢复,我就可以重新启动复制过程。但在生产环境中,当你在传输大型文件时,你可能并不希望这样做。

而且,你不能继续使用 scp 命令恢复被中止的进度。因为,如果你这样做,它只会覆盖现有的文件。这时你会怎么做?别担心!这是 rsync 派上用场的地方!rsync 可以帮助你恢复中断的复制或下载过程。对于那些好奇的人,rsync 是一个快速、多功能的文件复制程序,可用于复制和传输远程和本地系统中的文件或文件夹。

它提供了大量控制其各种行为的选项,并允许非常灵活地指定要复制的一组文件。它以增量传输算法而闻名,它通过仅发送源文件和目标中现有文件之间的差异来减少通过网络发送的数据量。 rsync 广泛用于备份和镜像,以及日常使用中改进的复制命令。

就像 scp 一样,rsync 也会通过 SSH 复制文件。如果你想通过 SSH 下载或传输大文件和文件夹,我建议您使用 rsync。请注意,应该在两边(远程和本地系统)都安装 rsync 来恢复部分传输的文件。

使用 rsync 恢复部分传输的文件

好吧,让我给你看一个例子。我将使用命令将 Ubuntu 16.04 ISO 从本地系统复制到远程系统:

$ scp Soft_Backup/OS\ Images/Linux/ubuntu-16.04-desktop-amd64.iso [email protected]:/home/sk/

这里,

  • sk是我的远程系统的用户名
  • 192.168.43.2 是远程机器的 IP 地址。

现在,我按下 CTRL+C 结束它。

示例输出:

[email protected]'s password: 
ubuntu-16.04-desktop-amd64.iso 26% 372MB 26.2MB/s 00:39 ETA^c

正如你在上面的输出中看到的,当它达到 26% 时,我终止了复制过程。

如果我重新运行上面的命令,它只会覆盖现有的文件。换句话说,复制过程不会在我断开的地方恢复。

为了恢复复制过程,我们可以使用 rsync 命令,如下所示。

$ rsync -P -rsh=ssh Soft_Backup/OS\ Images/Linux/ubuntu-16.04-desktop-amd64.iso [email protected]:/home/sk/

示例输出:

[email protected]'s password:
sending incremental file list
ubuntu-16.04-desktop-amd64.iso
                   380.56M 26% 41.05MB/s 0:00:25

看见了吗?现在,复制过程在我们之前断开的地方恢复了。你也可以像下面那样使用 -partial 而不是 -P 参数。

$ rsync --partial -rsh=ssh Soft_Backup/OS\ Images/Linux/ubuntu-16.04-desktop-amd64.iso [email protected]:/home/sk/

这里,参数 -partial-P 告诉 rsync 命令保留部分下载的文件并恢复进度。

或者,我们也可以使用以下命令通过 SSH 恢复部分传输的文件。

$ rsync -avP Soft_Backup/OS\ Images/Linux/ubuntu-16.04-desktop-amd64.iso [email protected]:/home/sk/

或者,

rsync -av --partial Soft_Backup/OS\ Images/Linux/ubuntu-16.04-desktop-amd64.iso [email protected]:/home/sk/

就是这样了。你现在知道如何使用 rsync 命令恢复取消、中断和部分下载的文件。正如你所看到的,它也不是那么难。如果两个系统都安装了 rsync,我们可以轻松地通过上面描述的那样恢复复制的进度。

如果你觉得本教程有帮助,请在你的社交、专业网络上分享,并支持我们。还有更多的好东西。敬请关注!

干杯!


via: https://www.ostechnix.com/how-to-resume-partially-downloaded-or-transferred-files-using-rsync/

作者:SK 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出