Linux 中的 scp 命令——在 Linux 中安全地复制数据

scp (Secure Copy) 是一个安全地将文件复制到远程主机和从远程主机复制文件的命令。 它在内部使用 SSH 来执行它的操作。

安装 scp 命令

scp 存在于 OpenSSH 客户端包中。 (openssh-server 包提供了 SSH 守护进程,而 openssh-client 包提供了各种与 SSH 相关的工具。)

对于 Ubuntu/Debian(及其衍生产品)

你可以安装 scp 使用 apt 命令:

sudo apt install openssh-client 

为了 Fedora/CentOS(基于 RedHat 的发行版及其衍生版)

你可以安装 scp 使用 dnf 命令:

sudo dnf install openssh-clients  #the name has an extra 's' 

笔记: 通过以下方式传输文件 scp, 它 应该 出现在发送端和接收端。 如果你尝试 scp 到一台没有的机器 scp 已安装,您可能会收到一条错误消息 scp: command not found 即使你可能有 scp 本地安装。

scp的基本用法

scp 命令的核心是从源获取文件并将其复制到目标。

scp <source> <target> 

有多种指定方式 sourcetarget. 一些常见的如下:

从本地机器复制到远程机器

scp path/to/local_file remote_host:path/to/remote_file 

这里 remote_host

  • 一个 IP 地址
  • 一个域名
  • 定义的主机 /etc/hosts 文件
  • 定义的主机 ~/.ssh/config

例如,复制一个文件 me.png 在我的主目录中从我的本地机器到我的 ubuntu-server (定义于 /etc/hosts),我会打字。

scp /home/pulsar17/me.png ubuntu-server:~/me.png 
从本地传输到远程机器

如果我以用户身份执行此命令 pulsar17, 同一个用户 必须是 出现在目标机器上的这种语法 target 去工作。

从远程机器复制到本地机器

要从远程机器复制到本地机器,只需切换源和目标。 该命令仍然必须运行 在本地机器上.

scp remote_host:path/to/remote_file path/to/local_directory 

对于此命令,执行此命令的用户必须同时出现在本地和远程计算机上。

作为远程机器上的特定用户复制

您还可以在复制时指定用户。 scp 将复制文件并将所有者设置为 user.

scp path/to/local_file [email protected]_host:path/to/remote_file 

以下命令将复制 me.png 到远程机器,但作为用户 juniordev.

scp /home/pulsar17/me.png [email protected]:~/me.png 
作为用户复制示例

通过这种语法,我可以在我有权访问的远程机器上以任何用户的身份进行复制。

以特定用户身份从远程机器复制 只需切换源和目标。

有用的选项

scp 有很多选择。 在这里,我将展示一些有用的。

带有 -r 选项的 scp

使用 -r 您可以选择递归复制目录(所有文件和子目录)。

scp -r /home/pulsar17/scripts ubuntu-server:~/ 
目录复制整个目录

上面的命令将复制整个 scripts 目录到远程机器。

带有 -p 选项的 scp

此选项指示 scp 保留原始文件中的修改时间、访问时间和模式。

带有 -q 选项的 scp

它启用安静模式。 它还禁用进度表以及来自 ssh 的警告和诊断消息。

scp -q /home/pulsar17/me.png  ubuntu-server:~/ 
安静模式 1静音模式

SSH配置,方便使用scp

如果你觉得你需要使用 scp 通常,您可以以节省时间和打字的方式设置环境。 以下是您可以实现的两种方法:

将常用主机添加到配置文件中

有两个地方可以将 IP 地址映射到名称,这样您就不必一次又一次地键入 IP 地址 在本地机器上. 这些将是 /etc/hosts 文件和 ~/.ssh/config.

如果您需要使用 SSH 特定选项,最好使用 ~/.ssh/config. 我将展示如何使用这两个文件进行配置。 您应该只使用其中之一。

~/.ssh/config 文件

打开 ~/.ssh/config 文件在您选择的编辑器中。 我将使用 nano 编辑器:

nano ~/.ssh/config 

向其中添加以下几行:

Host ubuntu-server         User root         HostName 192.168.1.168         #Port 22002 You can specify a port too 

Save 文件并退出nano。 您可以在此文件中添加多个主机。 这样配置后就可以替换了 [email protected]_host 配置文件中对应的Host后面的名称。 因此,例如,您可以使用:

# Instead of scp /home/pulsar17/me.png [email protected]:~/me.png just type scp /home/pulsar17/me.png ubuntu-server:~/me.png 

/etc/hosts 文件

该文件包含 IP 地址到主机名的映射,如键值映射。 映射 IP 地址 192.168.1.11 对名字 my-server, 类型:

echo 192.168.1.11$'t'my-server | sudo tee -a /etc/hosts 

$'t' 是打印文字 Tab 文件中的字符。

完成此操作后,您可以使用 Tab 完成功能来摆脱 bash. 在键入新映射的名称 (my-server 在这种情况下)在 scp 命令只需输入前几个字符并按 Tab , Bash 会为你自动补全名称。 (不过,您仍然需要用户名。它只会自动完成主机名。)

SSH 密钥而不是密码

要登录到远程机器,您可以使用 SSH 密钥代替传统的基于密码的身份验证。 要设置 SSH 密钥,请按照本教程进行操作。 你只需要做一次。

结论

scp 是一个非常有用的命令,可以安全地将文件从一台机器复制到另一台机器。 在本文中,我们学习了各种选项 scp 以及如何通过设置 ssh 密钥和适当的配置文件来利用它的强大功能。