При попытке передать все файлы с одного веб-сервера («источник») на другой («пункт назначения») команда wget подключается через FTP, но не может продолжить работу за пределами команды PASV.
Я использую SSH-соединение с «целевым» сервером (Linux-сервер на общем хостинге) для выполнения команды wget.
«Исходный» сервер - это сервер Microsoft, и FTP-клиент на моем рабочем столе не имеет с ним проблем.
Вот команда, которую я использую для инициации передачи:
wget -m ftp://username:'password'@sourceserver.com
Вход в систему прошел успешно, затем выдаются следующие команды:
==> SYST ... done. ==> PWD ... done.
==> TYPE I ... done. ==> CWD not needed.
==> ... couldn't connect to xxx.xxx.xxx.xxx port 1128: Connection timed out
Retrying.
С ошибкой «не удалось подключиться» при каждой повторной попытке он пытается использовать другой номер порта (а не 21, к которому он уже успешно подключился). В первый раз, когда я обратил внимание на ошибку, он попробовал порты в диапазоне 487X.
Я не могу сказать, на стороне сервера Microsoft («исходный») или на стороне Linux («клиент»).
Мысли?
Для передачи файлов или списков каталогов FTP открывает дополнительные TCP-соединения на динамических портах. В активном режиме клиент создает локальный прослушиватель и сообщает серверу о своем IP: порту с помощью команды PORT, а затем сервер подключается к порту клиента (обычно с порта 20 на стороне сервера). В пассивном режиме сервер открывает порт и сообщает клиенту, где он слушает, в ответ на команду PASV клиентов.
Оба режима требуют
Если у вас нет проблем с доступом к нему с вашего настольного клиента, возможно, ваш настольный клиент использует активный режим, а wget использует пассивный режим или что между вашим рабочим столом и сервером нет межсетевого экрана / NAT-маршрутизатора, но между вашим виртуальным хостингом и сервером он есть.
Не вдаваясь в подробности о вашей настройке, сложно строить предположения.
Другой способ - избежать пассивного режима, добавить аргумент --no-passive в вашу команду wget, чтобы это сделать.
wget -r --no-passive --no-parent ftp://account:<password>@<ip address>/folder/ -P /root
Для VSFTPD можно указать диапазоны пассивных портов.
pasv_min_port=1024
pasv_max_port=1048
Кредит: Настройка FTP на Amazon Cloud Server
Кроме того, я видел wget потерпеть поражение, но завиток добиться успеха когда
pasv_address
не соответствует IP-адресу запроса - например, запрос использовал IP-адрес внешней сети, но pasv_address был IP-адресом внутренней сети.
Не уверен, почему это произошло, но должно быть разница в базовой реализации между wget и curl.
Я предполагаю, что ваш ftp-сервер является частным IP и использует переадресацию портов NAT, вам необходимо включить FTP ALG на вашем устройстве NAT.
==> PASV ... не удалось подключиться к 192.168.1.3 порт 64316: время ожидания соединения истекло
После того, как вы включите FTP ALG на вашем устройстве NAT или брандмауэре, частный IP 192.168.1.3 изменится на общедоступный, поэтому wget сможет установить соединение с вашим ftp-сервером.