如何将文件从远程机器复制(或移动)到本地机器?

如何将文件从远程机器复制(或移动)到本地机器?

我通过 SSH 从本地 Ubuntu 机器连接到远程 Ubuntu 机器,并且想要将文件从远程 Ubuntu 复制/移动到本地 Ubuntu。

我需要这么做在 SSH 会话中(即从远程 Ubuntu 内部)。

这些不起作用:

scp [remote-source] [local-destination] # Which is actually:
scp /home/user/files_to_depart/file1.txt /home/user/files_that_arrived/file1.txt

否则怎么能做到这一点呢?

答案1

nullmeta 的回答完全有效,也许 nullmeta 会进行编辑以提供您正在寻找的说明。我发布了一个完全独立的解决方案,以解决由于网络结构(例如 NAT 防火墙)而难以简单地通过 ssh 返回本地系统的情况。

假设您有两台计算机,ComputerA 和 ComputerB。ComputerA 是您的本地工作站。ComputerB 是您可以通过 ssh 访问的远程计算机。

场景 1:如果 ComputerA不是NAT 防火墙后面

这是一个快速而简单的解决方案,结合了 scp 和 ssh(scp 使用 ssh 协议执行安全复制)。它要求您在两端(计算机 A 和计算机 B)安装 ssh 服务器(和客户端)。

要使用此解决方案,请从 ComputerB 运行:

scp /path/to/file/on/ComputerB ComputerAUser@ComputerA:/path/to/dump/file/on/ComputerA

场景 2:如果 ComputerANAT 防火墙后面

在这种情况下,您通常需要在 NAT 防火墙中配置端口转发。但是,您可能并不总是能够进行此类更改。在这种情况下,您可以配置从 ComputerA -> ComputerB 的 ssh 隧道,以便它也可以隧道反向连接。

建立 ComputerA -> ComputerB 的 ssh 连接时,请按以下方式使用 -R 选项。ssh ComputerBUser@ComputerB -R 2222:localhost:22其中,ComputerBUser是 ComputerB 上正在验证的帐户的用户名,2222是 ComputerB 上的空闲端口。我们将使用此端口从 ComputerB 反向隧道传输回 ComputerA。

现在来自 ComputerB,您可以按照以下方式发出 scp 命令,从 ComputerB 复制文件到 ComputerA,其中ComputerAUserComputerA 上的用户名是:

scp -P 2222 /path/to/file/on/ComputerB ComputerAUser@localhost:/path/to/drop/file/on/computerA

这里发生了什么?看起来我们只是告诉 ComputerB 将文件发送回它自己,因为我们传递的是localhost文件而不是 ComputerA。我们确实告诉 scp 将文件传递回 ComputerB,但传递到端口 2222。与 ComputerB 上端口 2222 的所有连接都会转发到 ComputerA 上的端口 22(默认 ssh 端口)。因此,通过在现有 ssh 连接上反向建立隧道,ComputerA 是否位于 NAT 防火墙后面并不重要。


场景 3:从 ComputerA 执行文件复制

或者,您不必尝试从 ComputerB 执行此操作,而是可以直接从 ComputerA 运行 scp 命令。

scp ComputerBUser@ComputerB:/path/to/file/on/ComputerB /path/to/dump/file/on/ComputerA

答案2

如果你需要一种简单的方法来浏览远程计算机的文件系统并将某些文件复制到本地计算机(反之亦然),你可以使用SSH文件系统

描述

  • man sshfs

    SSH文件系统(安全 Shell 文件系统)是 Linux(以及其他具有 FUSE 实现的操作系统)的文件系统,只需在远程计算机上使用安全 Shell 登录即可对远程计算机上的文件进行操作。在安装了 SSHFS 的本地计算机上,该实现利用了 FUSE(用户空间中的文件系统)内核模块。这样做的实际效果是,最终用户可以无缝地与通过 SSH 安全提供的远程文件进行交互,就像它们是他/她计算机上的本地文件一样。在远程计算机上使用 SSH 的 SFTP 子系统。

  • apt show sshfs

    sshfs是基于 SSH 文件传输协议的文件系统客户端。由于大多数 SSH 服务器已经支持此协议,因此设置起来非常容易:即在服务器端无需执行任何操作。在客户端,安装文件系统就像使用 ssh 登录服务器一样简单。

安装

sudo apt install sshfs

与本指南不同我还没有在 Ubuntu 16.04 上做任何其他事情。没有fuse用户组。

用法

  1. 创建合适的挂载目录,例如:

    mkdir ~/sshfs-mount-point
    
  2. 安装远程路径

    • 安装远程路径,当你使用默认的 ssh 设置时:

      sshfs user@IP:/remote/path ~/sshfs-mount-point
      
    • 安装远程路径,当您使用自定义 ssh 设置时:

      sshfs -o IdentityFile=/path/to/id_rsa,port=2222 user@hostname-or-IP:/remote/path ~/sshfs-mount-point
      
    • 安装远程路径,当您正确配置了 ~/.ssh/config文件时:

      sshfs hostname:/remote/path ~/sshfs-mount-point
      
  3. 卸载远程路径。有两种方法:

    • fusermount -u ~/sshfs-mount-point

    • sudo umount ~/sshfs-mount-point

根据问题使用

  • 当您从机器通过 ssh 连接时A机器,而你是有能力的建立 ssh 连接A。您可以使用上述方法之一从A.然后使用cprsync或者mc复制您的文件。

  • 当你通过 SSH 连接到机器时A机器,而你是不能建立来自A. 您可以在机器中创建专用文件夹并将文件复制到该文件夹​​中。将此文件夹挂载到机器上A并将这些文件移动到您想要的位置。您可以设置计划任务或者bash 脚本负责这个任务。

答案3

如果不处于 SSH 会话中,您可能想要使用

scp user@remotehost:/file/to/copy /local/destination

如果你的本地机器正在运行 sshd 并且端口打开,那么在 ssh 会话中你可以

scp /remote/file user@localmachine:/destination/file

此链接有一些解决方法 https://unix.stackexchange.com/questions/2857/ssh-easily-copy-file-to-local-system

编辑:对于造成的任何混淆,我深感抱歉,最简单、最有效的方法是打开第二个终端并运行我提到的第一个 scp 命令。

答案4

要通过网络将文件从一台计算机移动到另一台计算机,您可以使用scp实用程序(scp代表安全复制)。ssh仅用于远程登录访问。

由于您已经成功登录到网络上的另一台计算机,因此您可以简单地从那里将文件复制到本地计算机,但您需要ssh在本地计算机上运行守护进程。因此,请先安装它:

$ sudo apt-get install openssh-server -y

确保它已启动并正在运行(绿灯亮表示它已启动并正在运行):

$ systemctl status sshd

在此处输入图片描述

将远程计算机上要复制到本地计算机的所有文件放在单独的目录中。然后,使用此命令:

$ scp -r [DIRECTORY] [USER]@[IP_ADDRESS]:~/Downloads

-r表示将以递归方式处理目录及其所有内容。简而言之,这意味着每次要复制包含文件的目录时,您都要使用该选项。[DIRECTORY]是该目录的路径。[USER]是本地计算机上的用户。[IP_ADDRESS]是该计算机的 IP 地址。后面的内容:是您希望在本地计算机上保存文件的位置。在本例中,它是Downloads文件夹。

实际情况如下:

在此处输入图片描述

相关内容