FTP на экземпляре CentOS ec2 с использованием Java

Возникла проблема с FTP-передачей с нашего сервера (FileZilla, настройка в пассивном режиме) на наше веб-приложение, развернутое на экземпляре CentOS ec2. Вручную тестируя с помощью wget и ftp из экземпляра, мы можем аутентифицироваться, менять каталог и получать файлы. Однако наше развернутое веб-приложение ec2 не извлекает файлы, хотя оно успешно проходит аутентификацию и перемещается. Загрузка по FTP в нашем приложении отлично работает в нашей локальной сети, а также при внешнем тестировании (ноутбук разработчика с беспроводным подключением, без VPN)

В рамках этого мы написали более целенаправленные модульные тесты и в настоящее время воспроизводим случаи неудач и успехов со следующими, развернутыми из ec2 (отказ) и не-ec2 (успех):

import org.junit.Test;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;

public class FTPTest {

    @Test
    public void testFTPAccess() throws IOException {
        String fileUrl = "ftp://username:[email protected]/path/to/resource.txt";
        URL url = new URL(fileUrl);
        URLConnection uc = url.openConnection();
        InputStream is = uc.getInputStream();
        ByteArrayOutputStream out = new ByteArrayOutputStream(1024*10);
        com.google.common.io.ByteStreams.copy(is,out);
        System.out.println(new String(out.toByteArray()));
    }
}

Файл журнала сервера FileZilla идентичен для входа в систему, USER, PASS, CWD, но отличается после начала передачи.

Случай успеха выглядит следующим образом:

(000216) 8/28/2012 10:47:20 AM - (not logged in) (external IP)> Connected, sending welcome message...
(000216) 8/28/2012 10:47:20 AM - (not logged in) (external IP)> 220-FileZilla Server version 0.9.24 beta
(000216) 8/28/2012 10:47:20 AM - (not logged in) (external IP)> 220 Connected to server FTP!
(000216) 8/28/2012 10:47:20 AM - (not logged in) (external IP)> USER ftpUser
(000216) 8/28/2012 10:47:20 AM - (not logged in) (external IP)> 331 Password required for ftpUser
(000216) 8/28/2012 10:47:20 AM - (not logged in) (external IP)> PASS *********
(000216) 8/28/2012 10:47:20 AM - ftpUser (external IP)> 230 Logged on
(000216) 8/28/2012 10:47:20 AM - ftpUser (external IP)> TYPE I
(000216) 8/28/2012 10:47:20 AM - ftpUser (external IP)> 200 Type set to I
(000216) 8/28/2012 10:47:20 AM - ftpUser (external IP)> CWD DPS
(000216) 8/28/2012 10:47:20 AM - ftpUser (external IP)> 250 CWD successful. "/DPS" is current directory.
(000216) 8/28/2012 10:47:20 AM - ftpUser (external IP)> CWD DP276
(000216) 8/28/2012 10:47:20 AM - ftpUser (external IP)> 250 CWD successful. "/DPS/DP276" is current directory.
(000216) 8/28/2012 10:47:21 AM - ftpUser (external IP)> PASV ALL
(000216) 8/28/2012 10:47:21 AM - ftpUser (external IP)> 227 Entering Passive Mode (FTP Server IP4,190)
(000216) 8/28/2012 10:47:21 AM - ftpUser (external IP)> PASV
(000216) 8/28/2012 10:47:21 AM - ftpUser (external IP)> 227 Entering Passive Mode (FTP Server IP4,191)
(000216) 8/28/2012 10:47:21 AM - ftpUser (external IP)> RETR sales.txt
(000216) 8/28/2012 10:47:21 AM - ftpUser (external IP)> 150 Connection accepted
(000216) 8/28/2012 10:47:21 AM - ftpUser (external IP)> 226 Transfer OK
(000216) 8/28/2012 10:47:21 AM - ftpUser (external IP)> QUIT
(000216) 8/28/2012 10:47:21 AM - ftpUser (external IP)> 221 Goodbye
(000216) 8/28/2012 10:47:21 AM - ftpUser (external IP)> disconnected.

Случай отказа:

(000217) 8/28/2012 11:25:11 AM - (not logged in) (ec2 Instance IP)> Connected, sending welcome message...
(000217) 8/28/2012 11:25:11 AM - (not logged in) (ec2 Instance IP)> 220-FileZilla Server version 0.9.24 beta
(000217) 8/28/2012 11:25:11 AM - (not logged in) (ec2 Instance IP)> 220 Connected to server FTP!
(000217) 8/28/2012 11:25:11 AM - (not logged in) (ec2 Instance IP)> USER ftpUser
(000217) 8/28/2012 11:25:11 AM - (not logged in) (ec2 Instance IP)> 331 Password required for ftpUser
(000217) 8/28/2012 11:25:11 AM - (not logged in) (ec2 Instance IP)> PASS *********
(000217) 8/28/2012 11:25:11 AM - ftpUser (ec2 Instance IP)> 230 Logged on
(000217) 8/28/2012 11:25:12 AM - ftpUser (ec2 Instance IP)> TYPE I
(000217) 8/28/2012 11:25:12 AM - ftpUser (ec2 Instance IP)> 200 Type set to I
(000217) 8/28/2012 11:25:12 AM - ftpUser (ec2 Instance IP)> CWD DPS
(000217) 8/28/2012 11:25:12 AM - ftpUser (ec2 Instance IP)> 250 CWD successful. "/DPS" is current directory.
(000217) 8/28/2012 11:25:12 AM - ftpUser (ec2 Instance IP)> CWD DP276
(000217) 8/28/2012 11:25:12 AM - ftpUser (ec2 Instance IP)> 250 CWD successful. "/DPS/DP276" is current directory.
(000217) 8/28/2012 11:25:12 AM - ftpUser (ec2 Instance IP)> EPSV ALL
(000217) 8/28/2012 11:25:12 AM - ftpUser (ec2 Instance IP)> 229 Entering Extended Passive Mode (|||1318|)
(000217) 8/28/2012 11:25:12 AM - ftpUser (ec2 Instance IP)> EPSV
(000217) 8/28/2012 11:25:12 AM - ftpUser (ec2 Instance IP)> 229 Entering Extended Passive Mode (|||1319|)
(000217) 8/28/2012 11:25:12 AM - ftpUser (ec2 Instance IP)> EPRT |1|ec2 internal IP|37245|
(000217) 8/28/2012 11:25:12 AM - ftpUser (ec2 Instance IP)> 200 Port command successful
(000217) 8/28/2012 11:25:12 AM - ftpUser (ec2 Instance IP)> RETR products.txt
(000217) 8/28/2012 11:25:12 AM - ftpUser (ec2 Instance IP)> 150 Opening data channel for file transfer.
(000217) 8/28/2012 11:25:23 AM - ftpUser (ec2 Instance IP)> 425 Can't open data connection.

person Robert Gannon    schedule 30.08.2012    source источник


Ответы (2)


В случае успеха используется пассивный режим, а в случае отказа используется расширенный пассивный режим. У вас могут возникнуть трудности с тонкой настройкой FTP-соединения с использованием простого URLConnection. Вместо этого я настоятельно рекомендую использовать клиентскую библиотеку Java, такую ​​как Apache Commons Net. Вы найдете пример FTP на домашней странице.

person David Levesque    schedule 30.08.2012
comment
Давид, спасибо за ответ. Если я правильно понимаю, вы говорите, что URLConnection и, возможно, sun.net.www.protocol.ftp (это то, что использует приложение, но это был более простой тест) нельзя легко настроить для постоянного использования пассивного режима? Пожалуйста, извините любые ложные предположения; Я все еще пытаюсь понять, почему приложение, развернутое в X, выдает PASV и почему тот же код в Y выдает EPSV. Спасибо. - person Robert Gannon; 30.08.2012
comment
Да, насколько я знаю, нет простого способа изменить режим с помощью базового URLConnection. См. ответ на этот связанный вопрос: stackoverflow.com/questions/2282776/ - person David Levesque; 31.08.2012
comment
Спасибо, используя FTPClient apache и вызывая enterLocalPassiveMode, теперь работает аналогичный тест. - person Robert Gannon; 06.09.2012

попробуйте вызвать out.flush() или out.close() в конце вашего тестового метода. Кажется, основной поток умирает без сброса содержимого на сервер.

person Ajay Tiwari    schedule 30.08.2012