How do I copy a folder from remote to local using scp?
Asked Answered
A

14

3447

How do I copy a folder from remote to local host using scp?

I use ssh to log in to my server.
Then, I would like to copy the remote folder foo to local /home/user/Desktop.

How do I achieve this?

Azzieb answered 3/7, 2012 at 5:17 Comment(5)
The OP's question was whether it is possible to copy file from remote to local host while ssh'd to remote host. I'm not sure why no single answer has correctly addressed his/her question.Jarrett
The premise of the question is incorrect. The idea is, once logged into ssh, how to move files from the logged-in machine back to the client that is logged in. However, scp is not aware of nor can it use the ssh connection. It is making its own connections. So the simple solution is create a new terminal window on the local workstation, and run scp that transfers files from the remote server to local machine. E.g., scp -i key user@remote:/remote-dir/remote-file /local-dir/local-fileFibrosis
use mc: TAB, cd sh://USER@HOST, use the mc shortcuts, cd out when done.Melancholic
@sjas: in mc it's easier to use Left/Right on the menu > Shell link where you can type the alias you have in your ~/.ssh/config e.g. myhost: > OKLipoprotein
@Fibrosis yes your right. But you didn't address directly JeffDror, so I guess most people did not realize that your are answering JeffDror's question.Safeguard
F
6168
scp -r [email protected]:/path/to/foo /home/user/Desktop/

By not including the trailing '/' at the end of foo, you will copy the directory itself (including contents), rather than only the contents of the directory.

From man scp (See online manual)

-r Recursively copy entire directories

Fafnir answered 3/7, 2012 at 5:21 Comment(16)
I google this every time. Related comic: xkcd.com/1168Delp
@Fafnir I continue to get a permission denied (publickey) error when using this. How do I resolve that?Huihuie
@john-k, many possible reasons (scp not enabled on server, public key not authorized, file permission problem, ...). check if standard ssh works with your key first. consult the existing questions on that topic on sof/serverfault and if that doesn't help, ask a new one on serverfault with debug output from ssh / scp.Fafnir
You have to set up the RSA key on both machines - you may have to run ssh-add on the local machine as well.Naturalize
Two nice-to-knows I found: the -C flag adds compression and the -c flag lets you pass in other cipher types for better performance, like scp -c blowfish a@b:something . as seen in dimuthu's answerJenifer
scp -r [email protected]:/path/to/foo/. /home/user/Desktop/foo always copy and replaceGrandsire
use -p to preserve file modification times, permissions, etc! scp -pr user@...Valid
This answer lacks important explanation. Will you end up with Desktop/foo or will you have Desktop/allcontentsofFooGohere scp seems to act weird sometimes to me it does one thing then anotherSmutchy
for example this (typically used in shell scripts): su myuser -c "scp -r /var/www/myapp.org/uploads root@$jcrdevip:/var/www/mydevapp.com/uploads" will copy the contents from uploads to uploads. scp -r /var/www/myapp.org/uploads root@$jcrdevip:/var/www/mydevapp.com/uploads seems to copy the folder uploads into the mydevapp.com/uploads folder creating an unwanted subfolderSmutchy
@Smutchy with scp -r [email protected]:/path/to/foo /home/user/Desktop/ you should end up with Desktop/foo. With scp -r [email protected]:/path/to/foo/. /home/user/Desktop/ you will end up with the contents of foo in Desktop and all the sub-dirs of foo strewn under DesktopMitzimitzie
Important to note that you can't be logged into the remote server in the terminal window. In example if I'm working on my desktop I have to be on local terminal window or it won't work.Salami
If anyone know the remote server file and he stand in local also using pem file: scp -i pemfile.pem user@remote-server:~/remote/file/location /local/folder/locationMatti
Does this command merge remote data with local or it will be an entire replace?Enclave
@Delp The link you posted made me read a trillion comic strips in a day, I didn't get any work done and I completely forgot how I got to that site in the first place. Anyhow, thank you for the link....love the comic strips!Scoreboard
you'll never need to google it if you use aliases defined in ~/.ssh/config — then you can do scp -r mydir myhost: or scp -r myhost:thatdir .Lipoprotein
to copy just content without folder I had to place * scp -r [email protected]:/path/to/foo/* /home/user/Desktop/Invitation
H
367

To use full power of scp you need to go through next steps:

  1. Public key authorisation
  2. Create SSH aliases

Then, for example if you have this ~/.ssh/config:

Host test
    User testuser
    HostName test-site.example
    Port 22022

Host prod
    User produser
    HostName production-site.example
    Port 22022

you'll save yourself from password entry and simplify scp syntax like this:

scp -r prod:/path/foo /home/user/Desktop   # copy to local
scp -r prod:/path/foo test:/tmp            # copy from remote prod to remote test

More over, you will be able to use remote path-completion:

scp test:/var/log/  # press tab twice
Display all 151 possibilities? (y or n)

For enabling remote bash-completion you need to have bash-shell on both <source> and <target> hosts, and properly working bash-completion. For more information see related questions:

How to enable autocompletion for remote paths when using scp?
SCP filename tab completion

Horologist answered 4/12, 2013 at 6:21 Comment(8)
Tab completion is nonsense, just completes from the local host for me.Laddie
@b.long The question is "How to copy remote folder foo to local Desktop". My answer is "scp -r prod:/path/foo /home/user/Desktop". Hope you're able to see relations.Horologist
@Laddie Remote tab completion is a well know reature. It's nonsense just for you :)Horologist
@AlexanderYancharuk Maybe, but your answer does not do that for me, so your answer is at least restricted to some versions at the local and/or host machine.Laddie
@Laddie For me is was obvious because I'm using bash-shell. Thanks for pointing me on that! Answer updated.Horologist
My mistake @AlexanderYancharuk , I thought you were implying that the OP (@Slasengger) would need to modify his ~/.ssh/config in order to copy folders (which is incorrect). I see now that you were trying give him additional convenience with passwordless ssh.Clemenceau
@Alexander Yancharuk : Thanks for the answer, this is more detailed than just covering the syntax alone.Breathe
You can also use a tool like storm to automate the process of adding servers to .ssh/configHephzibah
P
360

To copy all from Local Location to Remote Location (Upload)

scp -r /path/from/local username@hostname:/path/to/remote

To copy all from Remote Location to Local Location (Download)

scp -r username@hostname:/path/from/remote /path/to/local

Custom Port where xxxx is custom port number

 scp -r -P xxxx username@hostname:/path/from/remote /path/to/local

Copy on current directory from Remote to Local

scp -r username@hostname:/path/from/remote .

Help:

  1. -r Recursively copy all directories and files
  2. Always use full location from /, Get full location/path by pwd
  3. scp will replace all existing files
  4. hostname will be hostname or IP address
  5. if custom port is needed (besides port 22) use -P PortNumber
  6. . (dot) - it means current working directory, So download/copy from server and paste here only.

Note: Sometimes the custom port will not work due to the port not being allowed in the firewall, so make sure that custom port is allowed in the firewall for incoming and outgoing connection

Protactinium answered 23/5, 2016 at 9:38 Comment(9)
It seems (at least in recent versions of Raspbian Jessie and Ubuntu) that scp uses -P (uppercase P) for port, while (oddly) ssh uses -p (lowercase).Adalineadall
-p is reserved for preserving "modification times, access times, and modes from the original file". So if you're using that for port, it's probably not working ;-) Unless you have a different version that used the lowercase p differently.Adalineadall
With ssh, yes. Not with scp (I assume).Adalineadall
What should i put if the directory contain a space?Fotinas
@hyprfrcb Use pwd to get location and use sameProtactinium
The ˋPortˋˋmight refer to the local? What if both ports are different?Polynuclear
@Polynuclear There is no matter because you will do scp after SSH login.Protactinium
@ShivSingh But if I do remote to local, I do not login.Polynuclear
As elaborate as this answer is, it's still not clear whether the files of destination will be copied to the other folder destination, or whole folder destination. If you do scp -r .../source .../target then the result will be .../target/source, whereas if you do scp -r .../source/* .../target then .../target will contain the files of sourcePantie
R
86

What I always use is:

scp -r username@IP:/path/to/server/source/folder/  .

. (dot): it means current folder. so copy from server and paste here only.

IP: can be an IP address like 125.55.41.311 or it can be host like ns1.mysite.example.

Ragucci answered 10/6, 2014 at 7:41 Comment(1)
Thank you for pointing out that . refers to current directory!Clyve
R
45

Better to first compress catalog on remote server:

tar czfP backup.tar.gz /path/to/catalog

Secondly, download from remote:

scp [email protected]:/path/to/backup.tar.gz .

At the end, extract the files:

tar -xzvf backup.tar.gz
Rapallo answered 29/5, 2014 at 11:12 Comment(3)
"Better" is highly depends on the data you are transferring and the effort it is to ssh to the server to do zipping/unzipping. And: you can add compression to scp with the -C flag, like scp -C a@b:bigfile ..Jenifer
This reminds me of the comment made by @Delp ! :D xkcd.com/1168Parodic
You saved me one extra googling.Nipper
S
24

Typical scenario,

scp -r -P port username@ip:/path-to-folder  .

explained with an sample,

scp -r -P 27000 [email protected]:/tmp/hotel_dump .

where,

port = 27000
username = "abc" , remote server username
path-to-folder = tmp/hotel_dump
. = current local directory
Schnorkle answered 6/7, 2015 at 7:21 Comment(1)
Thank your for the answer. -P for a specific SSH port was helpful for me.Glutamate
T
23

And if you have one hell of a files to download from the remote location and if you don't much care about security, try changing the scp default encryption (Triple-DES) to something like 'blowfish'.

This will reduce file copying time drastically.

scp -c blowfish -r [email protected]:/path/to/foo /home/user/Desktop/
Teniafuge answered 17/6, 2014 at 6:2 Comment(1)
According to this blog post you get even better performance with arcfour in stead of blowfish, but it has security flaws.Jenifer
C
21

Go to Files on your unity toolbar

enter image description here

Press Ctrl + l and write [email protected]

The 192.168.1.103 is the host that you want to connect.

The here one example

enter image description here

Capitation answered 9/11, 2015 at 21:5 Comment(1)
Completely off-topic. Downvoted because it contributes to diluting the relevant answers with a suboptimal and excessively specific approach which doesn't even answer the question.Pacifism
P
17

In case you run into "Too many authentication failures", specify the exact SSH key you have added to your severs ssh server:

scp -r -i /path/to/local/key [email protected]:/path/to/folder /your/local/target/dir
Pigweed answered 26/9, 2016 at 21:54 Comment(0)
C
15

The question was how to copy a folder from remote to local with scp command.

$ scp -r userRemote@remoteIp:/path/remoteDir /path/localDir

But here is the better way for do it with sftp - SSH File Transfer Protocol (also Secure File Transfer Protocol, or SFTP) is a network protocol that provides file access, file transfer, and file management over any reliable data stream.(wikipedia).

$ sftp user_remote@remote_ip

sftp> cd /path/to/remoteDir

sftp> get -r remoteDir

Fetching /path/to/remoteDir to localDir 100% 398 0.4KB/s 00:00

For help about sftp command just type help or ?.

Chronister answered 15/8, 2016 at 5:47 Comment(0)
C
5

I don't know why but I was had to use local folder before source server directive . to make it work

scp -r . [email protected]:/usr/share/nginx/www/example.org/
Creamer answered 29/4, 2016 at 19:44 Comment(1)
Assuming the user had permissions, could you do an absolute path without using root@Cutlet
P
4

It is better to use rsync than scp - because of ease-of use, while both are available on most Linux platforms

Simple one liner :

rsync -aP myfiles/ [email protected]:server_dir/

a to copy recursively, preserves symbolic links, special and device files, modification times, groups, owners, and permissions. It’s more commonly used than -r and is the recommended flag to use.

P to show progress

General form :

rsync -a ~/dir1 username@remote_host:destination_directory

With root as user, and to a specific IP address.

rsync -aP myfiles/ [email protected]:server_dir/

You can refer to digitalocean guide for Rsync

  • When inside the folder

rsync -ap . [email protected]:server_dir/

Primogeniture answered 24/8, 2023 at 17:24 Comment(2)
"It is better to use rsync than scp" - You should explain why.Tress
rsync -aPI source/ remote:destination/ -a for recursive, -P for progress, and -I for overriding existing files. The command will show to the progress for every file, which is much clearer than scp.Wilhelmina
F
1

The premise of the question is incorrect. The idea is, once logged into ssh, how to move files from the logged-in machine back to the client that is logged in. However, scp is not aware of nor can it use the ssh connection. It is making its own connections. So the simple solution is create a new terminal window on the local workstation, and run scp that transfers files from the remote server to local machine. E.g., scp -i key user@remote:/remote-dir/remote-file /local-dir/local-file

Fibrosis answered 12/9, 2022 at 8:17 Comment(0)
S
0

For Windows OS, we used this command.

pscp -r -P 22 hostname@IP:/path/to/Downloads   ./
Spavined answered 18/8, 2021 at 18:48 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.