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

我从我的本地Ubuntu机器通过SSH隧道到远程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 

怎么能这样呢?

nullmeta的答案是完全有效的,也许nullmeta会编辑以提供您正在寻找的澄清。 我正在发布一个单独的解决方案,以解决由于网络结构(想想NAT防火墙)简单地回到本地系统而可能很困难的情况。

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

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

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

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

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

场景2:如果ComputerA位于NAT防火墙之后

在这种情况下,您通常需要在NAT防火墙中配置端口转发。 但是,您可能无法始终进行这些更改。 在这种情况下,您可以从ComputerA – > ComputerB配置ssh隧道,以便它也可以隧道反向连接。

建立ssh连接ComputerA – > ComputerB时,请使用-R选项以下列方式执行此操作。 ssh ComputerBUser@ComputerB -R 2222:localhost:22其中ComputerBUser是正在进行身份validation的ComputerB上的帐户的用户名, 2222是ComputerB上的空闲端口。 我们将使用此端口从ComputerB反向隧道返回ComputerA。

现在从ComputerB ,您可以按以下方式发出scp命令,以从ComputerB – > ComputerA复制文件,其中ComputerAUser是您在ComputerAUser上的用户名:

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

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


方案3:从ComputerA执行文件复制

或者不是尝试从ComputerB执行此操作,您只需从ComputerA运行scp命令即可。

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

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

描述

  • 来自man sshfs

    SSHFS (Secure SHell FileSystem)是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

根据问题使用

  • 当您从机器A连接到机器B时 ,您可以建立从BA的ssh连接。 您可以使用上述方法之一从B上的A安装文件夹。 然后使用cprsyncmc复制文件。

  • 当您从机器A SSH连接到机器B时 ,您无法建立从BA的SSH连接。 您可以在机器B中创建专用文件夹,并将文件复制到该文件夹​​中。 在机器A上安装此文件夹,然后将这些文件移动到所需的位置。 您可以设置处理此任务的cronjob或bash脚本 。

您不想在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命令。

要通过网络将文件从计算机移动到计算机,请使用scp实用程序( scp代表安全副本)。 ssh仅用于远程登录访问。

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

 $ sudo apt-get install openssh-server -y 

确保它已启动并运行(绿灯表明它是):

 $ systemctl status sshd 

在此处输入图像描述

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

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

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

这就是这个过程在现实中的样子:

在此处输入图像描述