How to copy (or move) files from remote machine to local machine?

Solution 1:

nullmeta's answer is completely valid, and perhaps nullmeta will edit to provide the clarification you're looking for. I'm posting a separate solution altogether to account for the situation where it may be difficult because of network structure (think NAT firewall) to simply ssh back into the local system.

Say you have two computers, ComputerA and ComputerB. ComputerA is your local workstation. ComputerB is a remote machine that you can access via ssh.

Scenario 1: If ComputerA is not behind an NAT firewall

This is a swift and easy solution, combining scp and ssh (scp performs a secure copy using ssh protocols). It requires you to have an ssh server (and client) installed on both ends (computerA and computerB).

To use this solution, run from ComputerB:

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

Scenario 2: If ComputerA is behind an NAT firewall

In this scenario, you would typically need to configure port-forwarding in the NAT firewall. However, you may not always have access to make these kinds of changes. In this case, you can configure your ssh tunnel from ComputerA -> ComputerB such it can tunnel reverse connections as well.

When establishing the ssh connection ComputerA -> ComputerB, do so with the -R option in the following manner. ssh ComputerBUser@ComputerB -R 2222:localhost:22 where ComputerBUser is the username for the account on ComputerB being authenticated and 2222 is a free port on ComputerB. We'll use this port to reverse-tunnel back to ComputerA from ComputerB.

Now from ComputerB, you can issue the scp command in the following manner to copy files from ComputerB -> ComputerA where ComputerAUser is your username on ComputerA:

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

What's happening here? It looks like we are simply telling ComputerB to send the file back to itself because we're passing localhost instead of ComputerA. We are indeed telling scp to pass the file back to ComputerB, but to port 2222. All connections to port 2222 on ComputerB get forwarded to port 22 (default ssh port) on ComputerA. Thus, by tunneling backwards over the existing ssh connection, it doesn't matter that ComputerA is behind an NAT firewall.


Scenario 3: perform the file copy from ComputerA

Or rather than trying to do it from ComputerB, you can just run the scp command from ComputerA.

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

Solution 2:

If you need an easy way to browse the file system of a remote machine and copy certain files to the local machine (and vice versa) you can use SSHFS.

Description

  • From man sshfs:

    SSHFS (Secure SHell FileSystem) is a file system for Linux (and other operating systems with a FUSE implementation) capable of operating on files on a remote computer using just a secure shell login on the remote computer. On the local computer where the SSHFS is mounted, the implementation makes use of the FUSE (Filesystem in Userspace) kernel module. The practical effect of this is that the end user can seamlessly interact with remote files being securely served over SSH just as if they were local files on his/her computer. On the remote computer the SFTP subsystem of SSH is used.

  • From apt show sshfs:

    sshfs is a filesystem client based on the SSH File Transfer Protocol. Since most SSH servers already support this protocol it is very easy to set up: i.e. on the server side there's nothing to do. On the client side mounting the filesystem is as easy as logging into the server with ssh.

Installation

sudo apt install sshfs

Unlike this guide I haven't done anything other on my Ubuntu 16.04. There is no fuse user group.

Usage

  1. Create an appropriate mounting directory, for example:

    mkdir ~/sshfs-mount-point
    
  2. Mount a remote path:

    • Mount a remote path, when you using the default ssh settings:

      sshfs user@IP:/remote/path ~/sshfs-mount-point
      
    • Mount a remote path, when you using custom ssh settings:

      sshfs -o IdentityFile=/path/to/id_rsa,port=2222 user@hostname-or-IP:/remote/path ~/sshfs-mount-point
      
    • Mount a remote path, when you have properly configured ~/.ssh/config file:

      sshfs hostname:/remote/path ~/sshfs-mount-point
      
  3. Unmount the remote path. There are two ways:

    • fusermount -u ~/sshfs-mount-point

    • sudo umount ~/sshfs-mount-point

Usage according to the question

  • While you are ssh connected from machine A to machine B, and you are able to establish an ssh connection from B to A. You can use one of the above approaches to mount a folder from A on B. Then use cp, rsync or mc to copy your files.

  • While you are SSH connected from machine A to machine B, and you are not able to establish an SSH connection from B to A. You can create dedicated folder into machine B and copy your files into that folder. Mount this folder on machine A and move these files where you want. You can set cronjob or bash script which handle this task.

Solution 3:

To move files from computer to computer over a network, you use the scp utility (scp stands for secure copy). ssh is only used for remote login access.

Since you have already successfully logged in to another computer on your network, you can simply copy your files to your local machine from there, but you're going to need to get an ssh deamon running on your local machine. So, install it first:

$ sudo apt-get install openssh-server -y

Make sure that it's up and running (the green light thing shows that it is):

$ systemctl status sshd

enter image description here

Put all the files on the remote machine that you want to copy over to your local computer in a separate directory. Then, use this command:

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

-r means that the directory along with all its contents is going to be processed recursively. In simple terms, this means that it's the option you're going to use every time you want to copy a directory containing files. [DIRECTORY] is the path to that directory. [USER] is the user on your local machine. [IP_ADDRESS] is the IP address of that machine. The stuff after the : is where you want your files to be saved on your local machine. In this case, it's the Downloads folder.

This is what this process looks like in reality:

enter image description here