Using SCP To Download And Upload Files Through SSH

If you’re connecting to a server through SSH and there’s a file that you want to download from it, how do you do that? In this post I’ll show you show to use scp to download and upload files from a remote server through SSH.

I’m going to assume that you have an SSH key generated already. If you don’t, this guide from GitHub is fantastic. Follow that first.

You’ll also need a server to SSH into. It could be a server hosting a web application, a Raspberry Pi, or another computer on your home network. If you don’t have any of those and still want to try this out, I recommend using AWS EC2 to create the smallest instance size they have.

Downloading A File With SCP

To download a file, first you’ll have to locate it. Start by SSHing into your remote server. I’m going to be using a Raspberry Pi running Ubuntu on my home network.

1
ssh ubuntu@192.168.1.2

You can replace the IP address portion of this command with a URL. For instance, many AWS EC2 instances will have a URL that you connect to like this:

1
ssh ubuntu@ec2-1-2-3-4.compute-1.amazonaws.com

Once you’re in the server, use cd and ls to locate the file you want to transfer. You can also use ls -lha to show the file sizes in a human readable way.

The last thing you’ll need to do is to figure out the full directory this file is in. For instance, this won’t work: myfolder/myfiles.tar.gz. You’ll need this instead: /home/ubuntu/myfolder/myfiles.tar.gz. You can type the command pwd—print working directory—when you’re in the right folder to find this full path.

Back On Your Computer

Now that you’ve found the file and the full path to it, type exit to return to your computer. You invoke the SCP command like this:

1
scp username@remote_host:source_file destination_file

So for my Raspberry Pi where the host name is ubuntu, I would do this to copy the file to the current directory on my computer:

1
scp ubuntu@192.168.1.2:/home/ubuntu/myfolder/myfiles.tar.gz ./

Full Download Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
~/myfolder
❯ ssh ubuntu@192.168.1.2

Welcome to Ubuntu 20.04.1 LTS (GNU/Linux 5.4.0-1018-raspi aarch64)
...

ubuntu@raspberrypi:~$ ls
file1  file2  myfiles.tar.gz

ubuntu@raspberrypi:~$ pwd
/home/ubuntu

ubuntu@raspberrypi:~$ exit
logout
Connection to 192.168.1.2 closed.

~/myfolder
❯ ls

~/myfolder
❯ scp ubuntu@192.168.1.2:/home/ubuntu/myfiles.tar.gz ./
myfiles.tar.gz

~/myfolder
❯ ls
myfiles.tar.gz

Uploading A File With SCP

To upload a file to a server, you just switch the arguments to SCP:

1
scp source_file username@remote_host:destination_file

So to upload that same myfiles.tar.gz file back to my Raspberry Pi, I would use:

1
scp ./myfiles.tar.gz ubuntu@192.168.1.2:/home/ubuntu/myfolder/

Full Upload Example

1
2
3
4
5
6
7
8
9
10
11
12
~/myfolder
❯ scp ./myfiles.tar.gz ubuntu@192.168.1.2:/home/ubuntu/myfolder/
myfiles.tar.gz

~/myfolder
❯ ssh ubuntu@192.168.1.2

Welcome to Ubuntu 20.04.1 LTS (GNU/Linux 5.4.0-1018-raspi aarch64)
...

ubuntu@raspberrypi:~$ ls myfolder/
myfiles.tar.gz

Wrap Up

Getting files from and onto remote servers might seem impossible if you’ve never done it before. But scp is one of those things that, once you use it, you’ll always have at least a faint memory of its existence. And once you know there’s a way to do it, the only problem left is remembering the syntax.