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

У меня возникли проблемы с загрузкой каталогов (содержащих другие каталоги на несколько уровней) 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?

ИСПРАВЛЕНО : я изначально утверждал, что 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 

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

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

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

 sftp> mkdir bin sftp> put -r bin 

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

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

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

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

Вот так:

 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.

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

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

put -r .

Вы можете использовать yafc (еще anoter FTP / SFTP-клиент). Параметр -r работает там очень хорошо.

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

например :

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

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

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

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

Случай 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/