Любой unix:
У меня есть следующая строка cmd, которая отлично работает.
rsync -avr -e ssh /home/dir user@example.com:/home/
Но сейчас мне нужно настроить его для rsync с удаленным сервером, на котором есть только FTP-сервер. Как мне это сделать?
Я посмотрел справку по rsync, но быстро потерялся (я делаю это не очень часто).
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"
Как написано мольберт, 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 завершится ошибкой, поэтому операция в том числе удаление деревьев файлов будет размещаться в неправильном каталоге (корне)!
Я обновил скрипт, так что --delete
опция отключена по умолчанию, включите ее, раскомментировав DELETE= command
.
Вы этого не сделаете. rsync не может сделать этого за вас, это отдельный протокол, который не работает через FTP.
Однако вы можете захотеть попробовать csync. IIRC он обеспечивает поведение, подобное rsync, через HTTP. Я не могу комментировать, работает ли он через FTP, вам придется попробовать.
В зависимости от того, что вы на самом деле пытаетесь сделать, можно использовать совершенно другой подход. curlftps
чтобы смонтировать ftp-папку, а затем, возможно, rsync
две "локальные" папки.
Установка отличается в зависимости от вашего дистрибутива, поэтому я не могу обобщать это, но вам необходимо установитьfuse
и curlftpfs
(вероятно, в Debian уже есть fuse
установить по умолчанию), затем:
sudo apt-get install curlftpfs
Убедитесь, что fuse
модуль загружен (modprobe fuse
)
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
).Там есть Weex...
Weex - это утилита, предназначенная для автоматизации задачи удаленного обслуживания веб-страницы или другого FTP-архива. Он синхронизирует набор локальных файлов с удаленным сервером, выполняя загрузку и удаленное удаление по мере необходимости.
rsync не работает по ftp. На удаленной стороне ему нужен демон rsync или оболочка, из которой он может вызывать rsync. Ftp обычно позволяет вызывать несколько команд, и rsync не входит в их число. Существуют и другие инструменты, предназначенные для автоматизации задач ftp, например lftp.
Это похоже на хорошую и свободную посадку: https://savannah.gnu.org/projects/ftpsync/
Для того, что вы пытаетесь сделать, вы также можете использовать wget.
Вы можете использовать curlftpfs для монтирования ftp и использовать rsync после http://linux.die.net/man/1/curlftpfs
Я использую GVFS / FTP. Я монтирую свои удаленные FTP-серверы с жиголо. Поскольку они рассматриваются как локальные каталоги, почти все, что работает с локальными файлами, работает. rsync предназначен для удаленного вычисления хэшей файлов для сравнения файлов без их передачи, но при этом с виртуальными файлами файлы все равно передаются. unison и freefilesync обычно работают хорошо, но я столкнулся с проблемой, когда они захотели переименовать загруженный вами файл, без проблем с загрузкой. Это могло быть проблемой с gvfs 1.6.1.
Решение Jonas S может быть полезным в зависимости от обстоятельств, например, если у вас высокая скорость загрузки и медленная загрузка, проверка файлов на сервере может быть относительно быстрее, чем загрузка файлов без необходимости.
Вы, вероятно, захотите использовать CurlFTPFS: http://packages.ubuntu.com/search?suite=default§ion=all&arch=any&searchon=names&keywords=curlftpfs
Хотя в целом лучше использовать обычный FTP-клиент вместо rsync.
Если вы хотите автоматизировать задачу, используйте 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/
Он сделает остальную работу за вас .. удачи
Я не верю, что вы сможете это сделать, сервер, на котором вы пытаетесь выполнить Rsync, будет иметь только запущенный FTP-сервер, он не будет понимать команды, которые Rsync ему отправляет.
Если причина, по которой вы хотите это сделать, заключается в том, что у вас есть доступ только к порту 21, но у вас есть контроль над сервером, вы можете изменить порт, который Rsync прослушивает на сервере, но это, очевидно, полезно только в том случае, если вы этого не сделаете. хотите использовать FTP на этом порту.
rclone - отличное программное обеспечение, которое выполняет синхронизацию каталогов по ftp и многим другим протоколам, включая поставщиков облачных хранилищ (Amazon S3, Dropbox, Google Drive). Он может синхронизироваться с любым сочетанием локального или удаленного хранилища.
Чтобы настроить ftp
удаленное отслеживание эти инструкции.
Как только это будет сделано, операция синхронизации будет:
rclone sync /home/dir FTP_REMOTE:/home --progress
Использование «копий сайта» или «зеркала» может значительно сэкономить трафик.
Оба они обеспечивают эффективное инкрементное обновление.
Также есть wput:
wput --timestamping --reupload --dont-continue source-files ftp://target.host/dir
Имя пользователя и пароль считываются из ~ / .netrc. В противном случае, если вас не особенно беспокоит безопасность, вы можете указать их как ftp: // имя пользователя: password@target.host.
Для этого я сделал собственный инструмент командной строки: 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'
Установить sftp а затем вы можете использовать rsync.
Пользуюсь следующим.
rsync --delete --times --recursive --perms --owner --group --verbose --progress --stats -e ssh root@192.168.0.100:/folder1/ /folder2/