Як користуватися rsync через FTP


187

Будь-який unix:

У мене є такий cmd-рядок, який працює чудово.

rsync -avr -e ssh /home/dir user@example.com:/home/

Але мені потрібно встановити його зараз, щоб rsync на віддалений сервер, на якому є лише FTP-сервер. Як мені це зробити?

Я переглянув довідку rsync, але швидко загубився (я цим не займаюся дуже часто).


21
Це схоже на запитання, як використовувати HTTP через IRC або як використовувати FTP через SMTP ...
Juliano

2
Можливо, ви могли б пояснити деякі свої міркування щодо того, щоб хотіти це зробити, тоді ми можемо допомогти вам знайти життєздатне рішення.
Джеймс

1
По суті, я намагався автоматизувати резервне копіювання із спільного сервера хостингу, і не розумів, як працює rsync. я перейшов до vps зараз, і більше не маю обмеження у ftp
bumperbox

Подвійність - ваш бог: scie.nti.st/2013/4/13/…
користувач956584

Якщо розгортання є, що вам на думку, і ви не заперечуєте проти NodeJS, перевірте dploy , ледачий і добре працює з git
Frank Nocke

Відповіді:


78

Ви цього не робите. rsync не може цього зробити для вас, це власний протокол і не працює над FTP.

Можливо, ви захочете спробувати csync . IIRC забезпечує поведінку, схожу на rsync, через HTTP. Я не можу коментувати, чи працює він через FTP, вам доведеться спробувати.


1
Дивлячись на веб-сторінку csync , вона підтримує sftp, але немає жодної згадки про підтримку простого ftp.
Кіт Томпсон

162

rsync не буде працювати для вас з причин, про які згадували інші. Однак у lftp та ncftp є "дзеркальні" режими, які, ймовірно, відповідають вашим потребам.

Я використовую це для пересилання матеріалів з мого локального каталогу на веб-хост ftp або sftp:

lftp -c "set ftp:list-options -a;
open ftp://user:password@your.ftp.com; 
lcd ./web;
cd /web/public_html;
mirror --reverse --delete --use-cache --verbose --allow-chown  
--allow-suid --no-umask --parallel=2 --exclude-glob .svn"

2
lftp дуже приємно. ще один, про wputякий я тільки що дізнався, - це вбудований обмеження пропускної здатності.
karmakaze

122

Як писав мольберт , lftpце хороший інструмент.

Я пропоную вам параметризувати сценарій та скористатися

exclude-glob

параметри, які виключають назви файлів за допомогою функції glob (*,? ..) вашої оболонки:

#!/bin/bash    
HOST="your.ftp.host.dom"
USER="username"
PASS="password"
FTPURL="ftp://$USER:$PASS@$HOST"
LCD="/path/of/your/local/dir"
RCD="/path/of/your/remote/dir"
#DELETE="--delete"
lftp -c "set ftp:list-options -a;
open '$FTPURL';
lcd $LCD;
cd $RCD;
mirror --reverse \
       $DELETE \
       --verbose \
       --exclude-glob a-dir-to-exclude/ \
       --exclude-glob a-file-to-exclude \
       --exclude-glob a-file-group-to-exclude* \
       --exclude-glob other-files-to-exclude"

Попередження: переконайтеся, що цільовий каталог існує, інакше команда cd не вдасться, тому операція, включаючи видалення дерев файлів , відбуватиметься в неправильному каталозі (root)!

Я оновив скрипт, щоб цю --deleteопцію вимкнути за замовчуванням, увімкніть її, коментуючи DELETE= command.


Допомогла мені велика купа. Але мені довелося видалити "set ftp: list-options -a;" який куди возити речі.
мат

1
Чи є щось подібне, що робить те саме, що і для SFTP (FTPS?)?
trusktr

1
Я хотів би зробити це раніше cd $RCD, так, щоб запобігти-скрипт-з-друкарською помилкою від випадкового видалення файлів з невірного каталогу: set cmd:fail-exit yes. (Це , здається , lftpне помічає , що він на справді вийшов, поки не видає наступну команду.) - І перш , ніж cd $LCDя хотів би зробити це (в локальній оболонці, тобто у верхній частині суми) set -eu.
KajMagnus

3
Насправді, вперше запустивши сценарій, я ще не створив віддалений каталог, тому сценарій не зміг записати компакт-диск у той неіснуючий dir. Потім скрипт почав робити mirror, і таким чином --delete: d файли з неправильного режиму. (Але я знову скопіював їх назад, так що в цьому випадку це не мало значення. Можливо, це має значення для когось іншого.)
KajMagnus

1
Окрім дотримування порад @KajMagnus щодо використання "set -eu" та "cd $ LCD", додайте "mkdir -p $ LCD" перед "cd $ LCD" - таким чином ви можете бути впевнені, що каталог існує і ви " знову в ньому.
Пол Гір

25

Залежно від того, що ви насправді намагаєтеся зробити, інший абсолютно інший підхід може бути використаний curlftpsдля монтажу ftp папки, а потім, можливо, rsyncдвох "локальних" папок.

Установка відрізняється залежно від вашого дистрибутива, тому я не можу узагальнити це, але вам потрібно встановити fuseі curlftpfs(prolly Debian вже fuseвстановлено за замовчуванням), тоді:

  1. sudo apt-get install curlftpfs

  2. Переконайтеся, що fuseмодуль завантажений ( modprobe fuse)

  3. sudo curlftpfs ftp.yourserver.com /path/to/ftp/folder/ -o user=username:password,allow_other

Зауважте, що після останньої коми немає місця (це не помилка!). Якщо ви цим задоволені або не хочете робити це кожного разу, можете додати його до свого fstab (як правило, у /etc/fstab):

curlftpfs#user:password@ftp.yourserver.com /path/to/ftp/folder/ fuse auto,user,uid=1000,allow_other 0 0

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

Будьте в курсі двох речей:

  • Що розробник кинув проект рік-два тому, тож я не знаю, наскільки придатним / стабільним на даний момент.
  • Якщо пароль містить дивний символ, він curlftpfsможе вийти з ладу (можливо, ви можете зробити щось із цим .netrc).

FTP Fuse і rsync є найближчим до питання, але явно божевільне для будь-якого, крім невеликого набору невеликих файлів.
Стів-о

1
Чому це було б шалено? За замовчуванням rsync stat () s, він не порівнює вміст. Це можна зробити ls -l з ftp-клієнтом.
ptman

Я фактично спробував це (через rsnapshot), і це не спрацювало, кожен файл повертався та помилка, показуючи, що rsync не може створити посилання. Тож використання lftp спільно з rsnapshot зробив свою справу
Костянтин

Бездоганний 14.04 LTS; ще одна порада: коли ви будете готові демонтувати ваш FTP-сайт, просто використовуйте те, umount DIRде DIRбуло /path/to/ftp/folderвище.
Джо

1
2017 рік, і це все ще працює! Чесно кажучи, найпростіший спосіб копіювання файлів з FTP-сайтів.
Горіть

16

Є вікс ...

Weex - це утиліта, призначена для автоматизації завдань віддаленого обслуговування веб-сторінки чи іншого архіву FTP. Він синхронізує набір локальних файлів на віддалений сервер, виконуючи завантаження та віддалене видалення за необхідності.


2
Працює як шарм! Ви працюєте так: $ weex yourFTPconfigNameОсь посібник linuxcertif.com/man/1/weex
sobi3ch

9

rsync не працює над ftp. На віддаленій стороні йому потрібен або демон-rsync, або оболонка, з якої він може викликати rsync. Ftp, як правило, дозволяє викликати кілька команд, і rsync не є однією з них. Є й інші інструменти, призначені для автоматизації ftp-завдань, наприклад, "lftp".



7

Для того, що, здається, ви намагаєтеся зробити, ви також можете використовувати wget.

wget -m ftp: // ім'я користувача: password@domain.com


Це лише зробить дзеркало сайту. Ви не можете використовувати це для завантаження змін.
Девід В.

5

Ви можете використовувати curlftpfs для монтажу ftp та використання rsync після http://linux.die.net/man/1/curlftpfs


Ласкаво просимо до ServerFault! Це може бути вдалим початком, але деякі більш технічні деталі, чому це кращий підхід, і, можливо, макет щодо того, як це зробити, можуть бути розумними.
Скотт Пак

4

Я використовую GVFS / FTP. Я монтую свої віддалені сервери FTP за допомогою gigolo. Як вони розглядаються як локальні каталоги, майже все, що працює над локальними файлами, працює. rsync призначений для віддаленого обчислення хешів файлів для порівняння файлів без їх передачі, але при цьому з віртуальними файлами передає файли все одно. unison і freefilesync зазвичай працюють добре, але я зіткнувся з проблемою, коли вони хочуть перейменувати завантажений файл, не завантажуючи проблем. Це може бути проблемою з gvfs 1.6.1.


3

Рішення Jonas S може бути корисним залежно від обставин, наприклад, якщо у вас висока швидкість завантаження та повільне завантаження, перевірка файлів на сервері може бути відносно швидшою, ніж завантаження файлів без потреби.

Напевно, ви хочете використовувати CurlFTPFS, хоча: http://packages.ubuntu.com/search?suite=default§ion=all&arch=any&searchon=names&keywords=curlftpfs

Хоча, як правило, краще використовувати звичайний FTP-клієнт замість rsync.


2

Я не вірю, що ви зможете це зробити. На сервері, до якого ви намагаєтеся Rsync, буде працювати лише FTP-сервер, він не зрозуміє команд, які Rsync надсилає.

Якщо ви хочете це зробити, це те, що ви маєте доступ лише до порту 21, але у вас є контроль над сервером, ви можете змінити порт, який Rsync слухає, на сервері, але це, очевидно, корисно лише якщо ви цього не зробите хочу використовувати FTP на цьому порту.


2

Якщо ви хочете автоматизувати завдання, тоді використовуйте lftp, оскільки ви можете створити сценарій, як деякі люди опублікували вище, ви можете все це легко скриптувати на свій смак, якщо ви шукаєте одноразове рішення (тобто вам потрібно завантажити весь веб-сайт через ftp / перемістіть його на інший сервер) використовуйте ncftp, його просто, встановіть його, якщо його ще не встановлено:

apt-get install ncftp

або

yum install ncftp

(Вибачте, дистрибутив на основі недебіанської / червоної шапки ..)

після встановлення відкрийте ncftp в терміналі, а потім наберіть:

open -u ftpusername ftp.thedomain.com

Він запитає пароль, введіть його, а потім:

get -R /home/remotewebsite/public_html/ /home/localwebsite/public_html/

Це зробить іншу роботу за вас .. удачі



0

Також є wput:

wput --timestamping --reupload --dont-continue source-files ftp://target.host/dir

Ім'я користувача та пароль читаються з ~ / .netrc. В іншому випадку, якщо ви особливо не переймаєтесь безпекою, ви можете надавати їх як ftp: // username: password@target.host .


0

Для цього я створив власний інструмент командного рядка: ftpsync

Чому? Оскільки це просто і елегантно, інші інструменти вимагають багато залежностей, іноді компіляція, іноді не спрацьовує (наприклад, lftp на MacOs High Sierra). Ftpsync написаний чистим Python, не вимагає сторонніх ліфтів і він невеликий, ви можете просто включити файл у свій проект.

Використання: cd до каталогу вашого проекту та введіть:

ftpsync user:pass@ftp.address.url/remote/dir --delete

--delete означає видалення віддалених файлів, які не існують локально.

Якщо ви не хочете синхронізувати, а просто запустити необроблену команду ftp:

ftpsync -c '...'

Це корисно для деяких простих операцій, таких як надсилання файлу та перейменування його:

ftpsync -c 'PASV; TYPE I; STOR some_file.ext; RNFR some_file.ext; RNTO some_file_renamed.ext'

Натрапили на це з тієї ж причини, що й інші. Необхідність хорошої утиліти синхронізації через протокол FTP. Ваш інструмент виглядає добре, але я не міг використати його, оскільки моя вимога полягає у завантаженні з віддаленого і синхронізації з локальним. Хочу уникати завантаження вже завантажених файлів. У локальному режимі я обробляю завантажені файли, що робить його різним; що слід пропустити при наступному запуску FTP-скрипту. На даний момент важко знайти рішення.
anup

Так, насправді це одностороння синхронізація.
superdario128

0

rclone - це приємне програмне забезпечення, яке виконує синхронізацію каталогів через ftp та багато інших протоколів, включаючи постачальників хмарного зберігання (Amazon S3, Dropbox, Google Drive). Він може синхронізуватися до / з будь-якої комбінації локального або віддаленого сховища.

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

Після цього операція синхронізації:

rclone sync /home/dir FTP_REMOTE:/home --progress 

-7

Встановити sftp і тоді ви можете використовувати rsync.

Я використовую наступний.

rsync --delete --times --recursive --perms --owner --group --verbose --progress --stats -e ssh root@192.168.0.100:/folder1/ /folder2/

7
Це не FTP, він, ймовірно, використовує підсистему sftp, внутрішню для SSH (принаймні, це робиться в конфігурації за замовчуванням)
serverhorror

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