Загружать каталоги с помощью sftp?


97

У меня возникли некоторые проблемы при загрузке каталогов (которые содержат другие каталоги глубиной в несколько уровней) по sftp. Я понимаю, что могу обойти это, используя gzipping, но я не понимаю, почему это необходимо.

Во всяком случае, я стараюсь

sftp> put bin/
Uploading bin/ to /home/earlz/blah/bin
bin/ is not a regular file
sftp> put -r bin/
Uploading bin/ to /home/earlz/blah/bin
Couldn't canonicalise: No such file or directory
Unable to canonicalise path "/home/earlz/blah/bin"

Я думаю, что последнее сообщение об ошибке совершенно глупо. Таким образом, каталог не существует? Почему бы не создать каталог?

Есть ли какой-либо вопрос об этой проблеме с sftp, или я должен просто использовать scp?

Ответы:


68

ИСПРАВЛЕНО : я изначально ошибочно утверждал, что OpenSSH не поддерживает put -r. Да, но делает это очень странным образом. Кажется, ожидается, что каталог назначения уже существует, с тем же именем, что и исходный каталог.

sftp> put -r source
 Uploading source/ to /home/myself/source
 Couldn't canonicalize: No such file or directory
 etc.
sftp> mkdir source
sftp> put -r source
 Uploading source/ to /home/myself/source
 Entering source/
 source/file1
 source/file2

Что особенно странно, это то, что это применимо, даже если вы дадите другое имя для пункта назначения:

sftp> put -r source dest
 Uploading source/ to /home/myself/dest
 Couldn't canonicalize: ...
sftp> mkdir dest
sftp> put -r source dest
 Uploading source/ to /home/myself/dest/source
 Couldn't canonicalize: ...
sftp> mkdir dest/source
sftp> put -r source dest
 Uploading source/ to /home/myself/dest/source
 Entering source/
 source/file1
 source/file2

Для лучшей реализации рекурсии putвы можете использовать psftpинструмент командной строки PuTTY . Он находится в putty-toolsпакете под Debian (и, скорее всего, Ubuntu).

С другой стороны, Filezilla будет делать то, что вы хотите, если вы хотите использовать графический интерфейс.


К вашему сведению: sftpпозволяет put -rиз OpenSSH 5.4
Tino

3
Спасибо - я исправил свой ответ. Время пришло, а? ;-P
Jander

128

Я не знаю, почему sftp делает это, но вы можете только рекурсивно копировать, если каталог назначения уже существует. Так сделай это ...

sftp> mkdir bin
sftp> put -r bin

1
-rнужен OpenSSH 5.4 или выше
Tino

22

Вы могли бы быть заинтересованы в использовании rsyncвместо этого. Команда для этого будет

 rsync --delete --rsh=ssh -av bin/ remote-ip-or-fqdn:/home/earlz/blah/bin/

Это скопирует все bin/и поместит на удаленный сервер /home/earlz/blah/bin/. Как дополнительное преимущество, он сначала проверит, не изменился ли файл на удаленной стороне, и если нет, то не отправит его повторно. Кроме того, вы можете добавить опцию -z, и она сожмет ее для вас.


Awsome! Так просто!
Asken

3
Обратите внимание, что sftpэто команда и протокол . rsyncне поддерживает sftp-protocol.
Тино

9

lcd: ваша локальная папка (с подпапками)

cd: ваша удаленная папка

put -r .


на самом деле, я думаю, что это самый правильный ответ ... с целью размещения всей моей папки там
nopole

sftp пожаловался, когда я перешел в локальную родительскую папку и попытался поместить каталог по имени. Но cdв каталог я хотел загрузить это. Спасибо!
Каримкорун

8

Могу ли я предложить несколько сложный ответ, без архивирования, но с учетом tar?

Вот так:

tar -cf - ./bin | ssh target.org " ( cd /home/earlz/blah ; tar -xf - ) "

Это упакует каталог ./bin с tar (-cf: = create file), filename - (none, stdout) и передаст его через ssh-команду на target.org (который также может быть IP), где команда в кавычках выполняется: cd to blah и tar -xf (извлечь файл) - нет, нет имени, просто stdin.

Это как если бы вы упаковали пакет дома, принесли его на почту, а затем поехали на работу, где ожидали пакет, и открыли его.

Может быть, есть гораздо более элегантное решение, которое просто использует sftp.


Канал tar- это очень хорошее решение, однако для этого требуется sshподдержка входа ( sftpэто другой протокол ssh). tarв отличие от других, по умолчанию выполняется рекурсивно, передает все специальные файлы (FIFO, блочные / символьные устройства и т. д.), пытается преобразовать отображение UID / GID из источника в целевую систему и имеет традиционную короткую командную строку. (Одно исключение: «доменные сокеты Unix» не переносятся. Но кому это нужно?)
Tino

Я использую этот метод, когда мне нужно сжатие между узлами, также вы можете использовать pvинструмент для отслеживания скорости при длинных передачах
Felipe Alcacibar


1

Вы можете использовать rsync , который является очень мощной альтернативой для scp и sftp, особенно при обновлении копий с компьютера A на компьютер B, поскольку он не копирует файлы, которые не были изменены; он также может удалять с компьютера B файлы, которые были удалены с компьютера A (конечно, только если это указано).

например :

rsync -zrp /home/a/ user@remote.host.com:/home/b/  

Опция -r предназначена для рекурсивного копирования файлов, -z включает сжатие во время передачи, а -p сохраняет права доступа к файлам (создание, редактирование и т. Д.) При копировании, чего scp не выполняет AFAIK. Возможно еще много вариантов; как обычно, прочитайте справочные страницы.
Оригинальный ответ от Karolos


0

Войдите на удаленный сервер с помощью ssh, используйте sftp для подключения обратно к вашему устройству, затем используйте get -rкоманду для передачи каталогов на удаленный сервер. Команда get позволяет рекурсивно передавать каталоги, не создавая каталог.

ssh remote ip
sftp local ip 
get -r whichever-dir

0

Случай SFTP:

Мне нужно было скопировать эту структуру на моем FTP:

mainfolder --- folder --- subfolder
                  |           |
              file1.txt   file2.txt

Это решило мою проблему:

cd ./mainfolder
mkdir folder
put -r /from/source/folder/* /mainfolder/folder/
cd ./folder
mkdir subfolder
put -r /from/source/folder/subfolder/* /mainfolder/folder/subfolder/

0

Я только что узнал из Arch Linux Wiki, что можно смонтировать sftp-ресурс с помощью sshfs. Я использую sftp-сервер с chroot и jail, и sshfs работает очень хорошо.

  1. крепление: sshfs <sftpuser>@<server>:<read/writable/directory> <your/local/mount/directory>
  2. Размонтируйте: fusermount -u <your/local/mount/directory>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.