在Linux或者Unix中将文件从一台服务器复制到另一台服务器

时间:2020-01-09 10:37:42  来源:igfitidea点击:

在本文中,我将共享各种命令和工具,我们可以使用这些命令和工具将文件从Linux中的一台服务器安全地复制到另一台服务器。此外,还有其他传输文件的方法,我无法在此介绍,例如,我们还可以使用HTTPS上载和下载文件。

如果我们希望在Windows和Linux之间复制文件,则可以始终使用Samba,但是由于这里我们的目标是两台Linux计算机之间的文件传输,因此我将不共享与Samba配置有关的任何步骤。

我们可能会对与相关主题有关的更多文章感兴趣。

  • 2个命令,用于在Linux中将文件夹从本地服务器复制到远程服务器(反之亦然)

  • 在Linux中复制文件时,设置SFTP chroot Jail以将用户限制为特定目录的循序渐进指南

  • 如何在Linux中使用HTTPS在两个主机之间安全地传输文件

使用SFTP将文件从一台服务器复制到另一台服务器

在计算中," SSH"文件传输协议(也称为"安全文件传输协议"或者" SFTP")是一种网络协议,可通过任何可靠的数据流提供文件访问,文件传输和文件管理。

SFTP易于使用:在命令行上输入sftp以及远程系统的名称。系统提示我们输入帐户"密码";然后我们会在连接打开并等待的情况下进入SFTP。

我们也可以在Shell脚本中使用SFTP自动执行文件传输,也可以使用一个线性SFTP命令执行文件传输,而不是交互式会话。

[hynman@Ban17-inst01-a ~]$sftp -q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no [email protected]
Password:

在目标节点上输入" hynman"用户的密码后,将获得" sftp" shell

sftp> ls -l
-rw-r----- 1 root root 401 Dec 7 11:53 new_key.pub
-rw-r----- 1 hynman users 9 Dec 10 14:13 pwd.txt
drwxr-xr-x 2 root root 4096 Nov 28 11:38 scripts
-rw-r--r-- 1 root root 0 Dec 10 14:07 test_file

下一步是将文件从主机复制到客户端(即,将文件从主机上传到客户端)其中我希望在主机服务器上的文件" /home/hynman/pwd.txt"下有文件" pwd.txt"。复制到客户的当前工作目录

sftp> put /home/hynman/pwd.txt .
Uploading /home/hynman/pwd.txt to /home/hynman/./pwd.txt
/home/hynman/pwd.txt 100% 9 26.6KB/s 00:00

要复制目录及其所有内容,请使用(-r)。其中/home/hynman/mydir在我要复制到当前工作目录下的已连接客户端节点的主机上可用。

sftp> put -r /home/hynman/mydir .
Entering /home/hynman/mydir/

因此文件已成功上传。我们可以验证相同

sftp> ls
new_key.pub pwd.txt scripts test_file

接下来,将文件从客户端节点复制到主机服务器。我的客户端节点上的"/home/hynman/test_file"下有一个文件" test_file"

sftp> get test_file /tmp/
Fetching /home/hynman/test_file to /tmp/test_file

在主机服务器上进行验证

# ls -l /tmp/test_file
-rw-r----- 1 hynman hynman 0 Dec 10 14:09 /tmp/test_file

我们可以从sftp的手册页中获得更多受支持的选项。

使用RSYNC将文件从一台服务器复制到另一台服务器

rsync是一个实用程序,我们可以使用它很容易地将文件从一台服务器复制到另一台服务器,并且有许多选项可以让我们非常具体地了解如何传输数据。使rsync灵活的另一个方面是我们可以使用多种方法来处理源目录和目标目录。但是,我们甚至不必使用网络。我们甚至可以将数据从同一服务器上的一个目录复制到另一个目录。

将同一服务器内的文件从一个位置复制到另一位置

# rsync -r /home/hynman/mydir/test /tmp/

其中我们使用-r递归复制,我们也可以使用(-a),即用于存档,该存档保留尽可能多的元数据(在大多数情况下,它应使所有内容成为精确副本)。

注意:之所以行之有效,是因为无论何时rsync运行,它都会复制与上次运行不同的内容。我们第一次备份的文件已经存在,但是权限错误。当我们运行第二个命令时,rsync只需要复制不同的内容,因此它对文件应用了正确的权限。如果自上次运行命令以来,已将任何新文件添加到源目录,则新文件或者更新文件也将被复制。

在两个服务器之间复制文件

# rsync -av test [email protected]:/tmp/
Password:
sending incremental file list
sent 44 bytes received 12 bytes 22.40 bytes/sec
total size is 5 speedup is 0.09

使用SCP将文件从一台服务器复制到另一台服务器

rsync的一个有用替代方法是安全复制(SCP)实用程序,用于将文件从一台服务器复制到另一台服务器,该服务器与OpenSSH捆绑在一起。它使我们可以快速将文件从一个节点复制到另一个节点。如果目标是将一个文件或者少量文件发送到另一台计算机,SCP是一个很好的工具,可以用来完成工作。要利用SCP,我们将使用scp命令。由于我们很可能已经安装了OpenSSH,因此我们应该已经有scp命令可用

本质上,使用SCP与rsync非常相似。该命令需要一个源,一个目标和一个文件名。要将单个文件从本地计算机传输到另一个文件,生成的命令将类似于以下内容:

# scp -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null host_list [email protected]:/tmp/
Password:
host_list 100% 30 83.2KB/s 00:00

如果在执行scp时未指定目标目录,那么将使用目标用户的主目录作为目标目录。

# scp -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null host_list [email protected]:
Password:

重要说明:复制文件时,请确保始终至少包含冒号,因为如果不包含冒号,最终将文件复制到当前工作目录中,而不是目标文件中。

在前面的" scp"示例中,我们仅复制了一个文件。如果要传输或者下载整个目录及其内容,则需要使用-r选项,该选项允许我们进行递归复制:

# scp -r -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null /home/hynman/mydir [email protected]:
Password:

使用NFS将文件从一台服务器共享到另一台服务器

网络文件系统(NFS)是在Linux或者UNIX服务器之间共享文件的一种很好的方法。我写了另一篇文章,详细介绍了在RHEL/CentOS 7和8 Linux中使用示例设置NFSv4和NFSv3的步骤。

在我的RHEL节点上,我已经安装了nfs-utils,现在将设置我的导出。要设置NFS,首先让我们创建一些目录,我们将这些目录共享给其他用户。 NFS中的每个共享都称为"导出"。

# cat /etc/exports
/share *(rw,no_root_squash)
/share 10.0.2.0/255.255.255.0(rw,no_root_squash)
  • 在第一行中,我为"/share"目录提供了对world的共享访问权限。

  • 在第二行中,在一行中调出目录之后,我们还设置了能够访问它们的网络(在本例中为" 10.0.2.0/255.255.255.0")。这意味着,如果我们从其他网络进行连接,则将拒绝访问。

  • 就这些选项的作用而言,第一个(rw)是不言自明的。

  • 我们会经常在野外看到的一种选择是no_root_squash。通常,出于安全原因,一个系统上的root用户将无法映射到另一个系统上的任何人。在大多数情况下,一个拥有对另一个系统的根访问权的系统是个坏主意。 no_root_squash选项禁用此功能,它允许一端的root用户被视为另一端的root用户。 。

注意:有关导出的手册上的更多信息,请查看手册页以获取更多信息,我们可以将这些其他选项传递给导出。

接下来,在服务器上重新启动nfs-server服务

# systemctl restart nfs-server.service

查看当前导出的股票列表

# exportfs -v
/share 10.0.2.0/255.255.255.0(rw,sync,wdelay,hide,no_subtree_check,sec=sys,secure,no_root_squash,no_all_squash)
/share <world>(rw,sync,wdelay,hide,no_subtree_check,sec=sys,secure,no_root_squash,no_all_squash)

现在尝试从客户端挂载目录"/share"。

[root@node1 ~]# mount -t nfs node2:/share /mnt

这样我们的目录安装成功,接下来验证内容

[root@node1 ~]# cd /mnt/
[root@node1 mnt]# ls
test1 test2

我们可以使用以下命令在客户端节点上进行验证

[root@node1 mnt]# mount | grep share
node2:/share on /mnt type nfs4 (rw,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=10.0.2.20,local_lock=none,addr=10.0.2.21)

注意:对于我们的示例,我们禁用了防火墙和selinux。因此,如果我们遇到任何问题,请检查iptablesselinux规则并添加iptables规则以允许ssh连接。

在客户端节点上成功安装共享后,我们可以将文件本地复制到节点。

# cp -av /mnt/* /tmp/
‘/mnt/test1’ -> ‘/tmp/test1’
‘/mnt/test2’ -> ‘/tmp/test2’

使用SSHFS将文件从一台服务器复制到另一台服务器

SSH文件系统(SSHFS)是类似于NFS和Samba的文件共享解决方案。 NFS和Samba是指定文件共享的出色解决方案,但是如果我们要设置一个临时文件共享服务以在特定时间段内使用,则这些技术可能比必要的更为复杂。 SSHFS允许我们在本地计算机上挂载远程目录,并像对待其他目录一样对待它。已安装的SSHFS目录将在SSH连接的整个生命周期内可用,并可用于将文件从一台服务器复制到另一台服务器。

使用SSHFS的缺点

  • 文件传输的性能不会像NFS挂载那样快,因为还需要考虑加密

  • 另一个缺点是,当我们处理SSHFS装载中的文件时,我们希望定期保存工作,因为如果SSH连接由于任何原因而掉线,则可能会丢失数据。

SSHFS是EPEL信息库的一部分,我们可以使用yum进行安装

# yum -y install sshfs

为了使SSHFS正常工作,我们需要在本地Linux机器和远程Linux服务器上都存在一个目录。 SSHFS可以从具有SSH访问权限的远程服务器上挂载任何目录。

其中我从node1node2安装/share

[root@node1 ~]# sshfs root@node2:/share /mnt
root@node2's password:

现在验证/mnt的内容,并确保正确安装了路径

[root@node1 ~]# cd /mnt/
[root@node1 mnt]# ls
test1 test2
[root@node1 mnt]# mount | grep share
root@node2:/share on /mnt type fuse.sshfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0)

现在我们可以将文件从/mnt本地复制到任何其他目录

[root@node1 mnt]# cp -av * /tmp/
‘test1’ -> ‘/tmp/test1’
‘test2’ -> ‘/tmp/test2’

复制完成后,手动卸载相应目录。有两种方法可以这样做。首先,我们可以将umount命令用作root(就像我们通常那样):

[root@node1 ~]# umount /mnt/

我们也可以使用HTTPS进行文件共享,尽管它更像是使用curl命令通过GETPUT上传和下载文件。