Как использовать rsync через FTP

187

Любой юникс:

У меня есть следующая строка cmd, которая отлично работает.

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

Но мне нужно настроить его сейчас на rsync для удаленного сервера, на котором есть только FTP-сервер. Как мне это сделать?

Я посмотрел на справку по rsync, но быстро заблудился (я делаю это не очень часто).

bumperbox
источник
21
Это похоже на вопрос, как использовать HTTP через IRC или как использовать FTP через SMTP ...
Juliano
2
Может быть, вы могли бы объяснить некоторые из ваших соображений о желании сделать это, тогда мы можем помочь вам найти жизнеспособное решение.
Джеймс
1
по сути, я пытался автоматизировать резервное копирование с сервера общего хостинга и не понимал, как работает rsync. я перешел на vps сейчас, и у меня больше нет ограничений по ftp
bumperbox
Duplicity ваш бог: scie.nti.st/2013/4/13/...
user956584
Если развертывание есть, что у вас на уме, и вы не возражаете против NodeJS, посмотрите dploy , ленивый и хорошо работает с git
Фрэнк Ноке

Ответы:

78

Вы не rsync не может сделать это за вас, это собственный протокол, который не работает через FTP.

Однако вы можете попробовать csync . IIRC это обеспечивает rsync-подобное поведение по HTTP. Я не могу комментировать, работает ли он по FTP, вам придется попробовать.

serverhorror
источник
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котором я только что узнал, - это встроенное ограничение пропускной способности.
Кармаказе
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.
КайМагнус
3
Фактически, когда я впервые запустил свой сценарий, я еще не создал удаленный каталог, поэтому сценарий не смог записать CD в этот несуществующий каталог. Затем скрипт начал mirror, и таким образом --delete: D файлы из неправильного каталога. (Но я скопировал их обратно, так что в этом случае это не имело значения. Возможно, это важно для кого-то еще.)
KajMagnus
1
Следуя советам @KajMagnus по использованию 'set -eu' и 'cd $ LCD', добавьте 'mkdir -p $ LCD' перед 'cd $ LCD' - так вы можете быть уверены, что каталог существует, а вы ' в этом.
Пол Гир
25

В зависимости от того, что вы на самом деле пытаетесь сделать, можно использовать другой совершенно другой подход curlftpsдля монтирования папки ftp, а затем, возможно, rsyncдвух «локальных» папок.

Установка отличается в зависимости от вашего дистрибутива, поэтому я не могу обобщить это, но вам нужно установить fuseи curlftpfs(в 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 () не сравнивает содержимое. Это можно сделать с помощью ls -l с помощью ftp-клиента.
Птман
Я на самом деле пробовал это (через rsnapshot), и это не сработало, каждый файл возвращался с ошибкой, показывая, что rsync не может создать ссылку. Так что использование lftp в сочетании с rsnapshot сделало свое дело
Константин Переяслов
Безупречный на 14.04 LTS; дополнительный совет: когда вы будете готовы отключить ваш FTP - сайт просто использовать , umount DIRгде DIRбыл ваш /path/to/ftp/folderвыше.
Джо
1
2017, и это все еще работает! Честно говоря, самый простой способ скопировать файлы с FTP-сайта. Смонтируйте локально, затем rsync, как если бы он был локальным
td512
16

Есть weex ...

Weex - это утилита, предназначенная для автоматизации задачи удаленного ведения веб-страницы или другого FTP-архива. Он будет синхронизировать набор локальных файлов с удаленным сервером, выполняя загрузки и удаленное удаление по мере необходимости.

Johan
источник
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

shaftmx
источник
Добро пожаловать в ServerFault! Это может быть хорошим началом, но некоторые более технические детали относительно того, почему это лучший подход, и, возможно, макет того, как это сделать, могут быть разумными.
Скотт Пак
4

Я использую GVFS / FTP. Я монтирую свои удаленные FTP-серверы с помощью жиголо. Поскольку они рассматриваются как локальные каталоги, почти все, что работает с локальными файлами, работает. rsync предназначен для удаленного вычисления файловых хэшей для сравнения файлов без их передачи, но в любом случае это происходит с виртуальными файлами. Унисон и freefilesync обычно работают хорошо, но я столкнулся с проблемой, когда они хотят переименовать загруженный файл, без проблем при загрузке. Это может быть проблемой с gvfs 1.6.1.

Papou
источник
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

(извините не основанные на Debian / Red Hat дистрибутивы ..)

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

open -u ftpusername ftp.thedomain.com

Он попросит вас ввести пароль, введите его, а затем:

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

Это сделает все остальное для вас ... удачи

desdecode
источник
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, не требует сторонних библиотек и имеет небольшой размер, вы можете просто включить файл в свой проект.

Использование: перейдите в каталог вашего проекта и введите:

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

--delete выступает за удаление удаленных файлов, которые не существуют локально.

Если вы не хотите синхронизироваться, а просто запускаете команду raw ftp, используйте:

ftpsync -c '...'

Это полезно для некоторых простых операций, таких как отправка файла и переименование его:

ftpsync -c 'PASV; TYPE I; STOR some_file.ext; RNFR some_file.ext; RNTO some_file_renamed.ext'
superdario128
источник
Наткнулся на это по той же причине, что и другие. Необходима хорошая утилита синхронизации по протоколу FTP. Ваш инструмент выглядит хорошо, но я не могу использовать его, так как мое требование - скачивать с удаленного компьютера и синхронизировать с локальным. Я хочу избежать загрузки файлов, которые уже загружены. На локальных я делаю обработку загруженных файлов, что делает его отличным; это следует пропустить при следующем запуске сценария FTP. На данный момент сложно найти решение.
Anup
Да, на самом деле это односторонняя синхронизация.
superdario128
0

rclone - это отличная программа, которая выполняет синхронизацию каталогов по ftp и многим другим протоколам, включая провайдеров облачных хранилищ (Amazon S3, Dropbox, Google Drive). Он может синхронизироваться с любой комбинацией локального или удаленного хранилища.

Для настройки ftpпульта следуйте этим инструкциям .

Как только это будет сделано, операция синхронизации:

rclone sync /home/dir FTP_REMOTE:/home --progress 
Bernie
источник
-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 могут работать одинаково
Раджат