Любой юникс:
У меня есть следующая строка cmd, которая отлично работает.
rsync -avr -e ssh /home/dir [email protected]:/home/
Но мне нужно настроить его сейчас на rsync для удаленного сервера, на котором есть только FTP-сервер. Как мне это сделать?
Я посмотрел на справку по rsync, но быстро заблудился (я делаю это не очень часто).
Вы не rsync не может сделать это за вас, это собственный протокол, который не работает через FTP.
Однако вы можете попробовать csync . IIRC обеспечивает rsync-подобное поведение по HTTP. Я не могу комментировать, работает ли он по FTP, вам придется попробовать.
rsync не будет работать для вас по причинам, упомянутым другими. Однако lftp и ncftp оба имеют "зеркальные" режимы, которые, вероятно, будут соответствовать вашим потребностям.
Я использую это для отправки содержимого из моего локального каталога на веб-хостинг ftp или sftp:
lftp -c "set ftp:list-options -a;
open ftp://user:[email protected];
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:[email protected]$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
.
В зависимости от того, что вы на самом деле пытаетесь сделать, другой совершенно другой подход мог бы использовать curlftps
для монтирования папки ftp, а затем, возможно, rsync
две "локальные" папки.
Установка отличается в зависимости от вашего дистрибутива, поэтому я не могу обобщить это, но вам нужно установить Fuse
и curlftpfs
(в Debian уже есть Fuse
install по умолчанию), тогда:
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:[email protected] /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
Использование "sitecopy" или "mirror" может сэкономить вам большую пропускную способность.
Они оба обрабатывают эффективное постепенное обновление.
Для этого я создал собственный инструмент командной строки: ftpsync
Почему? Поскольку он простой и элегантный, другие инструменты требуют большого количества зависимостей, иногда компиляции, иногда не работают (например, lftp в MacOs High Sierra). Ftpsync написан на чистом Python, не требует сторонних библиотек и он небольшой, вы можете просто включить файл в свой проект.
Использование: перейдите в каталог вашего проекта и введите:
ftpsync user:[email protected]/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'
Также есть wput:
wput --timestamping --reupload --dont-continue source-files ftp://target.Host/dir
Имя пользователя и пароль читаются из ~/.netrc. В противном случае, если вы не особенно озабочены безопасностью, вы можете указать их как ftp: // username: [email protected] .