R загрузка файлов с ftp-сервера в Ubuntu

#r #ubuntu #ftp #google-cloud-platform #rstudio-server

#r #ubuntu #ftp #google-облачная платформа #rstudio-сервер

Вопрос:

все

Я запускаю сервер RStudio на виртуальной машине Google Cloud с Ubuntu 14.04 (см. Полное sessionInfo в конце). Я пытаюсь загрузить несколько файлов с ftp-сервера, и первым шагом является перечисление подкаталогов на сервере, для которых я использую RCurl пакет:

 library(RCurl)

getFiles <- function(dirs) {
urls <- paste(dirs, "/", sep="")
fls <- strsplit(getURL(urls, dirlistonly=TRUE), "r?n")
ok <- sapply(fls, length) > 0
unlist(mapply(paste, urls[ok], fls[ok], sep="", SIMPLIFY=FALSE),
     use.names=FALSE)
}

dirs <- "ftp://ftp.mtps.gov.br/pdet/microdados/RAIS"
folders <- getFiles(dirs)
  

Однако я получаю следующую ошибку:

 Error in function (type, msg, asError = TRUE)  : 
Failed to connect to ftp.mtps.gov.br port 21: Connection timed out
  

Я запустил тот же код локально, на своем компьютере с Windows, и все прошло отлично.

По-видимому, виртуальная машина не может установить соединение с ftp-сервером по какой-то причине, связанной с Linux (я провел некоторое исследование, и некоторые люди используют getBinaryURL вместо getURL , но я не смог понять, как применить это к моему коду …) Может кто-нибудь дать мне свет?

Вот подробная sessionInfo информация с виртуальной машины:

 R version 3.3.0 beta (2016-03-30 r70404)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 14.04.4 LTS

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C                   LC_TIME=en_US.UTF-8       
 [4] LC_COLLATE=en_US.UTF-8     LC_MONETARY=en_US.UTF-8        LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                  LC_ADDRESS=C              
[10] LC_TELEPHONE=C             LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
  

Комментарии:

1. вы проверяли, нужно ли использовать pasv ftp вместо «active»?

2. Привет, @MarcB. Извините, не могли бы вы уточнить это немного подробнее, пожалуйста? У меня нет большого опыта работы с машинами Linux…

3. это протокол ftp. стандартный ftp имеет соединения клиент-> сервер для отправки команд, но для получения данных сервер-> клиент требуется, чтобы сервер подключался к клиенту, что во многих случаях невозможно, поэтому есть «PASV» ftp, который имеет только соединения клиент-> сервер.

4. @MarcB, я попытался использовать команду quote PASV , чтобы проверить, является ли соединение пассивным, но команда ничего не вернет, поскольку соединение даже не было установлено…

5. Если вы работаете в Google Cloud, не имеет значения, кто является спонсором. Неразумные списки блоков — это неразумные списки блоков.