Как скопировать папку с удаленного на локальный с помощью scp? [закрыто]

2697

Как скопировать папку с удаленного на локальный хост с помощью scp?

Я использую, sshчтобы войти в свой сервер.
Затем я хотел бы скопировать удаленную папку fooв локальную /home/user/Desktop.

Как мне этого добиться?

Slasengger
источник
61
Вопрос OP заключался в том, можно ли скопировать файл с удаленного на локальный хост, в то время как ssh'd на удаленный хост . Я не уверен, почему ни один ответ не ответил правильно на его / ее вопрос.
JeffDror
3
Суть вопроса неверна. Идея состоит в том, чтобы после входа в ssh переместить файлы с зарегистрированного компьютера обратно на клиент, который вошел в систему. Однако scp не знает и не может использовать соединение ssh. Это делает свои собственные связи. Таким образом, простое решение - создать новое окно терминала на локальной рабочей станции и запустить scp, который передает файлы с удаленного сервера на локальную машину. Например, ключ scp -i user @ remote: / remote-dir / remote-file / local-dir / local-file
jeffmcneill
12
Вопрос может быть не по теме, но это также пост с самым высоким рейтингом в Google. Блокировка означает, что никто не может обновить его, чтобы обеспечить лучшее решение.
Алекс Харви
3
Недавно я задал похожий «немного более глубокий» вопрос, касающийся командной строки для другого инструмента в SuperUser, и его моды были перенесены в StackOverflow. В любом случае, я согласен с утверждением модов: можем ли мы перенести это в SuperUser, пожалуйста, разблокировать его и получить больше ответов?
Nikhil VJ
3
В общем, вся «не по теме» реакция на стек-поток является единственным большим недостатком платформы. Переусердствовал мартинец.
AdamC

Ответы:

4943
scp -r user@your.server.example.com:/path/to/foo /home/user/Desktop/

Если вы не включите завершающий символ '/' в конце foo, вы будете перемещать сам каталог (включая содержимое), а не только содержимое каталога.

С man scp(см. Онлайн-руководство )

-r Рекурсивно копировать целые каталоги

Грифиус
источник
1412
Я гуглю это каждый раз. Связанный комикс: xkcd.com/1168
cptloop
10
Два полезных факта, которые я обнаружил: -Cфлаг добавляет сжатие, а -cфлаг позволяет передавать другие типы шифров для повышения производительности, scp -c blowfish a@b:something . как показано в ответе dimuthu
Automatico
79
используйте -p, чтобы сохранить время изменения файла, разрешения и т. д.! scp -pr user @ ...
Ber
27
Этот ответ не имеет важных объяснений. Будете ли вы в конечном итоге Desktop/fooили у вас будет Desktop/allcontentsofFooGoherescp, кажется, иногда ведет себя странно, он делает одно, а потом другое
Toskan
7
@Toskan с scp -r user@your.server.example.com:/path/to/foo /home/user/Desktop/вами должно закончиться Desktop/foo. С scp -r user@your.server.example.com:/path/to/foo/. /home/user/Desktop/ вами в конечном итоге с содержимым fooв Desktopи все подкаталоги fooразбросаны подDesktop
Иоаннис
307

Чтобы использовать все возможности scp, вам необходимо пройти следующие шаги:

  1. Авторизация открытого ключа
  2. Создать псевдонимы SSH

Затем, например, если у вас есть ~ / .ssh / config :

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

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

вы избавите себя от ввода пароля и упростите синтаксис scp следующим образом:

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

Более того, вы сможете использовать удаленное завершение пути:

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

Обновить:

Для включения удаленного Баш-завершения вы должны иметь Баш-оболочки на обоих <source>и <target>хостов, и исправную Баш-завершение. Для получения дополнительной информации см. Связанные вопросы:

Как включить автозаполнение для удаленных путей при использовании scp?
Завершение вкладки имени файла SCP

Александр Янчарук
источник
12
Не знал о файле конфигурации, это круто!
dmastylo
Завершение вкладки - это ерунда, просто для меня это локальный хост.
Бернхард
14
@ b.long Вопрос «Как скопировать удаленную папку foo на локальный рабочий стол». Мой ответ - «scp -r prod: / path / foo / home / user / Desktop» . Надеюсь, вы сможете увидеть отношения.
Александр Янчарук
2
@Bernhard Для меня это было очевидно, потому что я использую bash-shell. Спасибо, что указали мне на это! Ответ обновлен.
Александр Янчарук
1
@ Александр Янчарук: Спасибо за ответ, это более подробно, чем просто описание только синтаксиса.
Гладиатор
217

Чтобы скопировать все из локального местоположения в удаленное местоположение (загрузить)

scp -r /path/from/destination username@hostname:/path/to/destination

Чтобы скопировать все из удаленного расположения в локальное расположение (скачать)

scp -r username@hostname:/path/from/destination /path/to/destination

Пользовательский порт, где xxxxнаходится пользовательский номер порта

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

Копировать текущий каталог из удаленного в локальный

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

Помогите:

  1. -r Рекурсивно копировать все каталоги и файлы
  2. Всегда использовать полное местоположение из /, Получить полное местоположение поpwd
  3. scp заменит все существующие файлы
  4. hostname будет имя хоста или IP-адрес
  5. если нужен специальный порт (кроме порта 22), используйте -P portnumber
  6. , (точка) - это текущий рабочий каталог, поэтому скачивайте / копируйте с сервера и вставляйте только здесь.

Примечание. Иногда пользовательский порт не будет работать из-за того, что порт не разрешен в брандмауэре, поэтому убедитесь, что пользовательский порт разрешен в брандмауэре для входящих и исходящих соединений.

Шив Сингх
источник
1
Кажется (по крайней мере в последних версиях Raspbian Jessie и Ubuntu), что scp использует -P (прописные буквы P) для порта, в то время как (странно) ssh использует -p (строчные буквы).
Адам Плохер
-p зарезервирован для сохранения «времени модификации, времени доступа и режимов из исходного файла». Так что, если вы используете это для порта, это, вероятно, не работает ;-) Если у вас нет другой версии, которая по-другому использовала строчные буквы p.
Адам Плохер
С ssh да. Не с scp (я полагаю).
Адам Плохер
Что я должен поставить, если каталог содержит пробел?
Brethlosze
@hyprfrcb Используйте, pwdчтобы получить местоположение и использовать то же самое
Шив Сингх
48

То, что я всегда использую, это:

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

, (точка) : это значит current folder. так что скопируйте с сервера и вставьте только здесь.

IP : может быть как IP-адрес, так 125.55.41.311и как хост ns1.mysite.com.

Маниш Шривастава
источник
9
Спасибо за указание, что .относится к текущему каталогу!
ericmjl
35

Лучше сначала сжать каталог на удаленном сервере:

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

Во-вторых, скачать с пульта:

scp user@your.server.example.com:/path/to/backup.tar.gz .

В конце распакуйте файлы:

tar -xzvf backup.tar.gz
Justi
источник
10
«Лучше» в значительной степени зависит от данных, которые вы передаете, и от усилий, которые необходимо выполнить для архивирования / распаковки на сервере ssh. И: вы можете добавить сжатие в scp с -Cфлагом, как scp -C a@b:bigfile ..
Автомат
4
Это напоминает мне комментарий, сделанный @cptloop! : D xkcd.com/1168
GoodSp33d
22

И если у вас есть чертовски файлы для загрузки из удаленного местоположения, и если вы не очень заботитесь о безопасности, попробуйте изменить шифрование по умолчанию scp (Triple-DES) на что-то вроде «blowfish».

Это значительно сократит время копирования файлов.

scp -c blowfish -r user@your.server.example.com:/path/to/foo /home/user/Desktop/
dimuthu
источник
2
Согласно этому сообщению в блоге вы получите еще более высокую производительность с arcfourв смене blowfish, но у него есть недостатки безопасности.
Автомат
20

Типичный сценарий,

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

объяснил с помощью образца,

scp -r -P 27000 abc@10.70.12.12:/tmp/hotel_dump .

где,

port = 27000
username = "abc" , remote server username
path-to-folder = tmp/hotel_dump
. = current local directory
Арун Г
источник
Спасибо за ответ. -P для конкретного порта SSH был полезен для меня.
Redoff
19

Перейти к файлам на панели инструментов единства

введите описание изображения здесь

Нажмите Ctrl + l и напишите здесь_goes_your_user_name@192.168.10.123

192.168.1.103 - это хост, к которому вы хотите подключиться.

Вот один пример

введите описание изображения здесь

Рональд
источник
12

Вопрос был в том, как скопировать папку из удаленной в локальную с помощью scpкоманды.

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

Но вот лучший способ сделать это sftp- SSH File Transfer Protocol (также Secure File Transfer Protocol, или SFTP) - это сетевой протокол, который обеспечивает доступ к файлам, передачу файлов и управление файлами по любому надежному потоку данных (википедия).

$ 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

Для получения справки о sftpкоманде просто введите helpили ?.

Фульвио
источник
12

Если вы столкнулись с «Слишком много ошибок аутентификации» , укажите точный ключ SSH, который вы добавили на сервер svers:

scp -r -i /path/to/local/key user@remote.tld:/path/to/folder /your/local/target/dir
кайзер
источник
5

Я не знаю почему, но мне пришлось использовать локальную папку перед директивой исходного сервера. заставить это работать

scp -r . root@888.888.888.888:/usr/share/nginx/www/example.org/
Salem
источник
1
Предполагая, что у пользователя есть разрешения, вы могли бы сделать абсолютный путь без использованияroot@
Джонатан