Завантаження каталогів з 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 зробить все, що завгодно, якщо ви хочете використовувати графічний інтерфейс.


FYI: sftpдозволяє put -rз OpenSSH 5.4
Tino

3
Дякую - я виправив свою відповідь. Настав час, так? ;-P
Jander

128

Я не знаю, чому sftp робить це, але ви можете рекурсивно копіювати лише тоді, коли каталог призначення вже існує. Тож роби це ...

sftp> mkdir bin
sftp> put -r bin

1
-rпотрібен OpenSSH 5.4 або вище
Тіно

22

Можливо, вам буде цікаво використовувати rsyncнатомість. Команда для цього була б

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

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


Чудовий! Так просто!
Запитано

3
Зверніть увагу, що sftpце команда та протокол . rsyncне підтримує sftp-протокол.
Тіно

9

lcd: ваша локальна папка (із вкладеними папками)

cd: Ваша віддалена папка

put -r .


насправді я думаю, що це найправильніша відповідь ... для того, щоб помістити туди всю свою папку
nopole

sftp поскаржився, коли я ввійшов до локальної батьківської папки і намагався ввести каталог по імені. Але cd, потрапивши в каталог, який я хотів завантажити, це зробив. Дякую!
karimkorun

8

Чи можу я запропонувати дещо складнішу відповідь без застібки, але включаючи дьоготь?

Ось і ми:

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

Це пакує каталог ./bin з tar (-cf: = створити файл), ім'я файлу - (немає, stdout) і передасть його через ssh-команду на target.org (яка може бути і IP-адресою), де команда у лапках виконується: cd to blah, а tar -xf (файл витягу) - none, no name, просто stdin.

Це так, як якщо ви запакуєте пакет вдома, принесіть його до пошти, потім їдете на роботу, де очікуєте пакунок і відкриєте його.

Можливо, є набагато більш елегантне рішення, яке просто використовує sftp.


Трубопровід tarє дуже хорошим рішенням, однак для цього потрібна sshпідтримка входу ( sftpє іншим протоколом зверху ssh). tarна відміну від інших, за замовчуванням працює рекурсивно, передає всі спеціальні файли (FIFO, пристрої блоків / символів тощо), намагається перевести відображення UID / GID з джерела в цільову систему і має традиційний короткий командний рядок. (Один виняток, хоча: "Сокети домену Unix" не передаються. Але кому вони потрібні?)
Tino

Я використовую цей метод, коли мені потрібно стиснення між вузлами, також ви можете використовувати pvінструмент для перегляду швидкості в довгих передачах
Феліпе Алькасібар


1

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

наприклад :

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

Параметр -r призначений для рекурсивного копіювання файлів, -z дозволяє стиснути під час передачі, а -p зберігає дозволи файлу (створення файлів, редагування тощо) при копіюванні, що scp не робить AFAIK. Можливе набагато більше варіантів; як завжди, читайте чоловікові сторінки.
Оригінальна відповідь Каролоса


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/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.