Страницы

Поиск по вопросам

Показаны сообщения с ярлыком ftp. Показать все сообщения
Показаны сообщения с ярлыком ftp. Показать все сообщения

пятница, 24 января 2020 г.

Удаление списка файлов

#c_sharp #ftp


Как разумно удалить большой список файлов на FTP?

Можно удалять через FtpWebRequest, но, как я понимаю, удаление большого списка будет
весьма длительным, т.к. для каждого файла необходимо составлять новый запрос и заново
коннектиться. Или же это не так?
    


Ответы

Ответ 1



Заново коннектиться не обязательно using (var connection = new FTPConnection()) //Тут создаем новое соединение { foreach (string file in files) //Тут удаляем файл } //Тут ваше соединение закрывается автоматически вызовом IDisposable

C# ftp загрузка файлов из директории

#c_sharp #ftp


Как реализовать функцию загрузки всех файлов из X директории в Y директорию на ftp.

Я добился, что отправляется один файл. Но есть две проблемы:

1 В директорие очень много файлов под директорий.

2 Если файл уже есть с таким именем, надо затирать новым файлом.

            requestFTPUploader = (FtpWebRequest)WebRequest.Create("ftp://127.0.0.1/Destination/"
+ fileName);
            requestFTPUploader.Credentials = new NetworkCredential("user", "pass");
            requestFTPUploader.Method = WebRequestMethods.Ftp.UploadFile;

            FileInfo fileInfo = new FileInfo(filepath);
            FileStream fileStream = fileInfo.OpenRead();

            int bufferLength = 2048;
            byte[] buffer = new byte[bufferLength];

            try
            {
                Stream uploadStream = requestFTPUploader.GetRequestStream();
                int contentLength = fileStream.Read(buffer, 0, bufferLength);

                while (contentLength != 0)
                {
                    uploadStream.Write(buffer, 0, contentLength);
                    contentLength = fileStream.Read(buffer, 0, bufferLength);
                }

                uploadStream.Close();
                fileStream.Close();
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception.Message.ToString());
            }

            Console.WriteLine(fileName + "Uploaded");


Т.е. нужна функция со входящими параметрами: user, pass, sourceDir, destinationDir.
А на выходе скопированные/замещённые файлы на сервер по протоколу ftp.
    


Ответы

Ответ 1



Очень много файлов? Ну хорошо, значит, будет долго копироваться. Это ведь не проблема? Используйте WebRequestMethods.Ftp.DeleteFile: var requestFtpDeleter = (FtpWebRequest)WebRequest.Create( "ftp://127.0.0.1/Destination/" + fileName); requestFtpDeleter.Credentials = new NetworkCredential("user", "pass"); requestFtpDeleter.Method = WebRequestMethods.Ftp.DeleteFile; using (var response = (FtpWebResponse)requestFtpDeleter.GetResponse()) { bool isSuccessful = response.StatusCode >= 200 && response.StatusCode < 300; // исключение при ошибке? }

воскресенье, 12 января 2020 г.

Медленная передача файлов с linux-сервера

#linux #windows #centos #ssh #ftp


Сервер с centos 6.4.
Если отправляю файлы с сервера на внешнее хранилище (windows-машина с FTP и SSH сервисами),
при помощи lftp или scp -r то передача идет на скорости около 500 КБ/сек.

Если подключаюсь к windows-машине и с неё при помощи WinSCP по scp забираю файлы
с сервера - то скорость взлетает до 40 мегабит.

10 файлов, от 100МБ до 8ГБ. Суммарный объем около 12ГБ.
Канал около 50 мегабит.

Куда копать? Как ускорить отправку файлов?

Скрин производительности:



Обновление

Сравнил загрузку процессора на обоих машинах при передаче обоими способами, разница
незначительная - в пределах 10 % (Что, на мой взгляд, можно отнести к погрешности).

Если на windows машину лить файлы не с сервера, а еще откуда нибудь тоже медленно.
Хотя "windows - машинка" достаточно мощная и шустрая. Нагрузки на процессор почти нет,
памяти свободной около 70% (Общий объем 8ГБ).

Почему может возникать такая разница в скорости передачи данных в зависимости от
инициатора?

При передаче с сервера на другую машину в сети - со скоростью всё хорошо:  



А при отправке с другой машины на windows- очень медленная передача.

Обновление 2

Я пробовал передавать при помощи lftp, подключаясь к опубликованному на той же машине
(IIS) ftp-серверу. Ситуация примерно такая же. Может сможете посоветовать хороший ssh/scp
сервер для windows? Сейчас используется Bitvise SSH server.
    


Ответы

Ответ 1



Ответа на вопрос "Почему так" не нашёл. Сделал костыль, который позволил обойти проблему. На windows установил ssh сервер. С Linux отправляю на windows по ssh команду забрать файлы с Linux по scp при помощи WinSCP cli. Жуткая конструкция, но работает.

понедельник, 6 января 2020 г.

Как получить файл (кириллица в имени) с FTP?

#python #python_3x #ftp #unicode


Python 3.5, ftplib

В каком виде ftp.nlst() получает имена файлов? И как их привести к нормальному виду?

filelist = ftp.nlst()   - получаем список имен файлов
print (filelist[3])     - выводим имя 4-ого файла и получаем иероглифы


@jfs >>> print(ascii(filelist[6])) '\xc8\xed\xf1\xf2\xf0\xf3\xea\xf6\xe8\xff.pdf'

Спасибо за подробный ответ)
    


Ответы

Ответ 1



Изначально (RFC 765, 959), FTP только 7-бит ASCII поддерживал, RFC 2640 расширяет поддержку до других кодировок, RFC 3659 уточняет, что команды такие как MLST могут вернуть пути либо в UTF-8 кодировке, либо это может быть произвольная каша байтов—за некоторыми исключениями такими как CRLF (новая строка, b'\x0d\x0a'), одинокий Telnet IAC (b'\xff'). На POSIX имена файлов могут быть произвольной последовательностью байтов за исключением b'\x2f' и b\x00' (слэш и ноль). В Питоне 3, ftplib формально использует latin-1 кодировку по умолчанию, которая произвольную последовательность байт позволяет в Unicode декодировать. В: В каком виде ftp.nlst() получает имена файлов? ftp.nlst() возвращает список текстовых (Unicode) строк. В: И как их привести к нормальному виду? Если вы знаете, что сервер использует единственную кодировку для имён файлов в вашем случае (вероятно, utf-8, если вывод команды feat её показывает) и нет непредставимых имён (PEP 383), то правильные имена можно получить декодированием: filename = filename.encode(ftp.encoding).decode(your_encoding) Можно передать 'surrogateescape' обработчик ошибок в .decode(), чтобы поддерживать и непредставимые имена (чтобы была возможность без потерь восстановить изначальные байты, одновременно позволяя печатать представимые имена в «нормальном виде»). Судя по результату ascii(), в вашем случае ftp-сервер возвращает имена в cp1251 кодировке (ANSI codepage на русской Винде): >>> print(ascii(filelist[6])) '\xc8\xed\xf1\xf2\xf0\xf3\xea\xf6\xe8\xff' В этом случае, your_encoding='cp1251', чтобы получить исходное имя: filename = filelist[6].encode(ftp.encoding).decode('cp1251') # -> 'Инструкция' Чтобы зря не перекодировать, можно перед вызовом ftp.nlst() выставить ftp.encoding = 'cp1251', если известно что все имена файлов в этой кодировке представимы. Тогда ftp.nlst() сразу вернёт правильно декодированные имена.

суббота, 21 декабря 2019 г.

Как отключить сообщения cURL?

#php #curl #ftp


Добрый день. Есть код на PHP который получает список файлов с FTP сервера. Код работает
через прокси, который поддерживает режим FTP over HTTP. Вот
сам код

$proxy_host = "1.1.1.1";  
$proxy_port = 8080;  
$curl = curl_init();  
$ftp_url = 'ftp://login:password@ftp:21/dir'; 
curl_setopt($curl,CURLOPT_TIMEOUT,10); 
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
curl_setopt($curl,CURLOPT_FTPLISTONLY,1);
curl_setopt($curl,CURLOPT_PROXYTYPE,CURLPROXY_HTTP);
curl_setopt($curl,CURLOPT_PROXY,$proxy_host);
curl_setopt($curl,CURLOPT_PROXYPORT,$proxy_port);
curl_setopt($curl,CURLOPT_PROXYUSERPWD,'login_proxy:password_proxy');
curl_setopt($curl,CURLOPT_URL,$ftp_url); 
curl_setopt($curl,CURLOPT_VERBOSE,FALSE);
curl_setopt($curl,CURLOPT_HEADER,0);  
$content=curl_exec($curl);
echo $content;


Код работает прекрасно, однако вывод списка файлов всегда предваряет сообщение
curl 230 OK. Current restricted directory is /. Это сообщение присутствует даже тогда
когда я пытаюсь скачать файлы. То есть содержимое всех скачанных файлов содержит это
диагностическое сообщение. Как отключить вывод этого сообщения?

Дополнение
Параметр CURLOPT_VERBOSE (true,false,отсутствует) никак не влияет на сообщение. Есть
подозрение что он включен по умолчанию и не отключается.

Еще дополнения
пробовал на версиях PHP 5.3.13 и 5.6.30
версия curl (из phpinfo) 7.24.0
Важно то, что без proxy сервера все работает отлично.  
    


Ответы

Ответ 1



curl 230 OK. Current restricted directory is / Это сообщение выводится не из php, а из прокси-программы через которую вы отправляете запрос. Я не знаю что за софт там стоит может быть это 'Pure-FTPd' или что-то в этом роде. Но похоже что это он делает STDOUT перед показом того что вы запросили.. и соответственно ваш курл уже все это и подтягивает. Нужно уже смотреть в сторону как это заглушить, отправить в > /dev/null, смотреть конфиги и т.д.

Ответ 2



Попробуйте опции CURLOPT_HEADER или CURLINFO_HEADER_OUT (а, вероятно, и обе вместе) поставить в false. Тут описаны дополнительные опции, пошарьтесь в них если не помогло.

Ответ 3



Если внимательно прочитать CURLOPT_VERBOSE : TRUE для вывода подробной информации. Записывает вывод в STDERR или файл, указанный с помощью CURLOPT_STDERR. По скольку CURLOPT_VERBOSE - FALSE ничего не сказано, и притом в вашем случае он не соответствует логическому продолжению,то думаю что с использованием опции CURLOPT_STDERR поможет решить вашу проблему. Замените: ..... curl_setopt($curl,CURLOPT_VERBOSE,FALSE); ..... На: Заранее создайте файл curl.txt ..... $stderr = fopen("curl.txt", "w"); curl_setopt($curl, CURLOPT_VERBOSE, TRUE); curl_setopt($curl, CURLOPT_STDERR, $stderr); .....

пятница, 20 декабря 2019 г.

Как автоматически вызывать обрыв ftp-соединения?

#linux #shell #ftp #функциональное_тестирование


Скрипт на python в ходе работы скачивает файлы с ftp-сервера. 

Процесс использует боевой ftp, и я не хотел бы усложнять процесс поднятием виртуалки
с тестовым ftp - работа скрипта чувствительна к содержимому и мне придется настраивать
обновление данных.

Нужно протестировать поведение при обрыве соединения в процессе скачивания. Желательно
делать это автоматически, то есть вручную делать kill myftpserver или выдергивание
шнура из сетевой карты — не вариант.

Таким образом, мне нужно либо обрывать текущее соединение прямо на тестовом сервере,
либо поднимать прокси, на нем ждать соединения и обрывать через секунду-другую. Не
представляю, как это реализовать. Нужно хотя бы название утилиты или команды, которой
я смогу отловить текущее соединение и оборвать его, либо блокировать все текущие соединения
на заданный ip.

Разумеется, тестирую я на тестовом инстансе. К нему есть root-доступ по ssh.
    


Ответы

Ответ 1



Думаю проще всего делать это с помощью iptables. Просто запрещать передавать пакеты, можно попробовать действия REJECT для быстрого обрыва или DROP для слета по таймауту. Простейшее правило (если задается на машине где тестируемая прога) типа iptables -I OUTPUT -d ip-ftp-сервера -j REJECT Добавлять можно простеньким скриптом на shell периодически делая задержки sleep, например. Или усложнить само правило и задействовать например connbytes. sudo iptables -I OUTPUT -d ip-ftp-сервера -m \ connbytes --connbytes 10000 --connbytes-dir both \ --connbytes-mode bytes -j REJECT должно оборвать соединение после прокачки по нему 10 килобайт. Если с iptables до этого не работали ... iptables -I добавляет правило. iptables -D с точно такими же параметрами, как были при добавлении - удаляет. iptables -L -nv покажет существующие правила

суббота, 14 декабря 2019 г.

FTP сервер возвращает ошибку 227

#c_sharp #ftp


Доброго времени суток. Собственно, сабж в титле.

Сама ошибка выглядит по меньшей мере непонятно:


  "Удаленный сервер возвратил ошибку: 227 Entering Passive Mode
  (192,168,1,136,39,43)"


при чём тут ошибка? мне же и нужно в пассивный режим зайти... ладно, едем дальше.

Опыта работы с ftp нет, нашел какие то исходники, собрал проект, выдаётся вышеупомянутое
исключение. Упростил код до невозможности, ошибка осталась. Странность ещё в том, что
в totalCommander соединение удаётся,

    private void btn_connect_Click_2(object sender, RoutedEventArgs e)
    {
        FtpWebRequest requestDir = (FtpWebRequest)FtpWebRequest.Create("ftp://192.168.1.136/");
        requestDir.Credentials = new NetworkCredential("username", "password");
        requestDir.Method = "LIST";
        requestDir.UseBinary = true;
        requestDir.EnableSsl = false;
        requestDir.UsePassive = true;

        try
        {
            WebResponse response = requestDir.GetResponse();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString() + ": \n" + ex.Message);
        }
    }


пробовал так же ставить 


  requestDir.UsePassive = false;


Получил ошибку 500, синтаксическую, мол, команда не опознана.
Буду благодарен, если мне объяснят, что я делаю не так)
    


Ответы

Ответ 1



Задайте requestDir.UsePassive = false; Далее, в чем возможно заключается сама ошибка и почему сервер возвращает ошибку 500. Дело в том что Вы задали команду вывода списка файлов: requestDir.Method = "LIST"; Попробуйте сначала вывести список директорий: requestDir.Method = WebRequestMethods.Ftp.ListDirectory; или так: requestDir.Method = "NLST"; Список предустановленных команд FTP в .NET: https://msdn.microsoft.com/ru-ru/library/system.net.webrequestmethods.ftp(v=vs.110).aspx

Ответ 2



Без костылей решить не удалось. Банально скачал левую dll для работы с FTP (сам тут человек новый, так что ссыль на Cyberforum, где первоначально задавал вопрос, как залить архив - не увидел))). Далее работал так: FTP _ftp; private void btn_Connect_click(object sender, RoutedEventArgs e) { _ftp = new FTP(); _ftp.TransferCompleteEvent += new FTP.TransferCompleteEventHandler(ftp_TransferCompleted); _ftp.HostAddress = "192.168.1.136"; _ftp.UserName = "username"; _ftp.Password = "password"; _ftp.Port = 21; _ftp.UseBinary = true; _ftp.OverwriteFiles = true; _ftp.OverwriteReadOnlyFiles = false; _ftp.EnableSSL = false; _ftp.UsePassive = true; _ftp.Connect(); string localPath = new FileInfo(System.Reflection.Assembly.GetExecutingAssembly().Location).DirectoryName; _ftp.CurrentDirectory = @""; _ftp.DownloadDirectoryAsync(localPath, @"datalog"); } private void ftp_TransferCompleted(Object sender, TransferCompletedEventArgs e) { _ftp.Disconnect(); //... }

понедельник, 15 июля 2019 г.

Реализация передачи файлов по локальной сети с помощью ftp-сервера на C# или Java

Как сделать передачу файлов от одного устройства другому, при условии подключения к одной сети Wi-Fi?
Нужно, чтобы при выборе файла (собираемся передать его на другое устройство) запускался ftp-сервер или другая реализация (http) в фоновом режиме, а на экран выводился адрес этого сервера, чтобы скачать этот файл с другого устройства (по этому адресу).
Например: ftp://192.168.2.123:2137 или http://.....:8080
где: 192.168.2... - ip-адрес устройства
Когда мы вводим данный адрес на другом устройстве(в приложении), либо в браузере, происходит скачивание данного файла.
Подскажите пожалуйста, способы реализации данной задумки, приветствуются примеры в виде кода.


Ответ

Создайте класс, реализующий TCP или UDP соккеты, и уже через них работайте. Все достаточно тривиально. Для веба, можно передавать веб-заголовки, соответственно, на сервере проверять, если есть подключение, то пытаемся отправить ему файл. Можете прочитать спецификацию FTP и соответственно, реализовать подобную технологию на соккетах в шарпе. Примеров кода tcp сервера и локального http сервера полно в интернете. Несколько ссылок есть на хабре.

пятница, 12 июля 2019 г.

C# ftp загрузка файлов из директории

Как реализовать функцию загрузки всех файлов из X директории в Y директорию на ftp.
Я добился, что отправляется один файл. Но есть две проблемы:
1 В директорие очень много файлов под директорий.
2 Если файл уже есть с таким именем, надо затирать новым файлом.
requestFTPUploader = (FtpWebRequest)WebRequest.Create("ftp://127.0.0.1/Destination/" + fileName); requestFTPUploader.Credentials = new NetworkCredential("user", "pass"); requestFTPUploader.Method = WebRequestMethods.Ftp.UploadFile;
FileInfo fileInfo = new FileInfo(filepath); FileStream fileStream = fileInfo.OpenRead();
int bufferLength = 2048; byte[] buffer = new byte[bufferLength];
try { Stream uploadStream = requestFTPUploader.GetRequestStream(); int contentLength = fileStream.Read(buffer, 0, bufferLength);
while (contentLength != 0) { uploadStream.Write(buffer, 0, contentLength); contentLength = fileStream.Read(buffer, 0, bufferLength); }
uploadStream.Close(); fileStream.Close(); } catch (Exception exception) { Console.WriteLine(exception.Message.ToString()); }
Console.WriteLine(fileName + "Uploaded");
Т.е. нужна функция со входящими параметрами: user, pass, sourceDir, destinationDir. А на выходе скопированные/замещённые файлы на сервер по протоколу ftp.


Ответ

Очень много файлов? Ну хорошо, значит, будет долго копироваться. Это ведь не проблема? Используйте WebRequestMethods.Ftp.DeleteFile
var requestFtpDeleter = (FtpWebRequest)WebRequest.Create( "ftp://127.0.0.1/Destination/" + fileName); requestFtpDeleter.Credentials = new NetworkCredential("user", "pass"); requestFtpDeleter.Method = WebRequestMethods.Ftp.DeleteFile; using (var response = (FtpWebResponse)requestFtpDeleter.GetResponse()) { bool isSuccessful = response.StatusCode >= 200 && response.StatusCode < 300; // исключение при ошибке? }

пятница, 21 июня 2019 г.

FTP Connection is not open

Здравствуйте. Использую в своем приложении библиотеку Commons Net 3.4 от Apache и столкнулся со следующей проблемой. При попытке подключиться к FTP серверу выдает ошибку: "java.io.IOException: Connection is not open". Может кто-нибудь помочь с данной проблемой? Данные от FTP введены 100% правильно.
public static Boolean downloadAndSaveFile(String server, int portNumber, String user, String password, String filename, File localFile) throws IOException { FTPClient ftp = null;
try { ftp = new FTPClient(); ftp.connect(server, portNumber);
ftp.login(user, password); ftp.setFileType(FTP.BINARY_FILE_TYPE); ftp.enterLocalPassiveMode();
OutputStream outputStream = null; boolean success = false; try { outputStream = new BufferedOutputStream(new FileOutputStream(localFile)); success = ftp.retrieveFile(filename, outputStream); } finally { if (outputStream != null) { outputStream.close(); } }
return success; } finally { if (ftp != null) { ftp.logout(); ftp.disconnect(); } } }


Ответ

Причиной данной ошибки может служить:
отсутствие соответствующего разрешения в манифесте; выполнение метода в UI-потоке.
Соответственно решается:
добавлением android.permission.INTERNET запуском метода в бэкграунде

четверг, 21 марта 2019 г.

Развертывание deb-репозитория и ftp сервера

Настроил deb репозиторий, локально по протоколу file:/ все работает. Для того чтобы расшарить его в сеть развернул ftp сервер, который тоже работает. Выставил опцию anonymous_enable=YES. Через терминал могу подключиться как anonymous.
В source.list добавил репозиторий. При выполнении sudo apt-get update выводится
игн ftp://10.10.2.18 wily InRelease игн ftp://10.10.2.18 wily Release.gpg игн ftp://10.10.2.18 wily Release [100%] ожидание заголовков
В лог ftp сервер ничего не пишет, значит apt-get не может достучаться до машины с рерозиторием.
В чем может быть проблема?


Ответ

В лог ftp сервер ничего не пишет, значит apt-get не может достучаться до машины с рерозиторием.
неправильный вывод. файлы игнорируются потому, что сервер сообщил, что таких файлов нет. см. этот ответ: How do Ign and Hit affect apt-get update?
если бы возникли ошибки с доступом, apt так бы об этом и написал.

дополнение: насколько я понимаю, отсутствуют перечисленные файлы в каталоге /корень-вашего-ftp/dists/wily/

среда, 13 февраля 2019 г.

Как получить файл (кириллица в имени) с FTP?

Python 3.5, ftplib
В каком виде ftp.nlst() получает имена файлов? И как их привести к нормальному виду?
filelist = ftp.nlst() - получаем список имен файлов print (filelist[3]) - выводим имя 4-ого файла и получаем иероглифы
@jfs >>> print(ascii(filelist[6])) '\xc8\xed\xf1\xf2\xf0\xf3\xea\xf6\xe8\xff.pdf'
Спасибо за подробный ответ)


Ответ

Изначально (RFC 765, 959), FTP только 7-бит ASCII поддерживал, RFC 2640 расширяет поддержку до других кодировок, RFC 3659 уточняет, что команды такие как MLST могут вернуть пути либо в UTF-8 кодировке, либо это может быть произвольная каша байтов—за некоторыми исключениями такими как CRLF (новая строка, b'\x0d\x0a'), одинокий Telnet IAC (b'\xff').
На POSIX имена файлов могут быть произвольной последовательностью байтов за исключением b'\x2f' и b\x00' (слэш и ноль).
В Питоне 3, ftplib формально использует latin-1 кодировку по умолчанию, которая произвольную последовательность байт позволяет в Unicode декодировать.
В: В каком виде ftp.nlst() получает имена файлов?
ftp.nlst() возвращает список текстовых (Unicode) строк.
В: И как их привести к нормальному виду?
Если вы знаете, что сервер использует единственную кодировку для имён файлов в вашем случае (вероятно, utf-8, если вывод команды feat её показывает) и нет непредставимых имён (PEP 383), то правильные имена можно получить декодированием:
filename = filename.encode(ftp.encoding).decode(your_encoding)
Можно передать 'surrogateescape' обработчик ошибок в .decode(), чтобы поддерживать и непредставимые имена (чтобы была возможность без потерь восстановить изначальные байты, одновременно позволяя печатать представимые имена в «нормальном виде»).

Судя по результату ascii(), в вашем случае ftp-сервер возвращает имена в cp1251 кодировке (ANSI codepage на русской Винде):
>>> print(ascii(filelist[6])) '\xc8\xed\xf1\xf2\xf0\xf3\xea\xf6\xe8\xff'
В этом случае, your_encoding='cp1251', чтобы получить исходное имя:
filename = filelist[6].encode(ftp.encoding).decode('cp1251') # -> 'Инструкция'
Чтобы зря не перекодировать, можно перед вызовом ftp.nlst() выставить ftp.encoding = 'cp1251', если известно что все имена файлов в этой кодировке представимы. Тогда ftp.nlst() сразу вернёт правильно декодированные имена.

пятница, 9 ноября 2018 г.

Как автоматически вызывать обрыв ftp-соединения?

Скрипт на python в ходе работы скачивает файлы с ftp-сервера.
Процесс использует боевой ftp, и я не хотел бы усложнять процесс поднятием виртуалки с тестовым ftp - работа скрипта чувствительна к содержимому и мне придется настраивать обновление данных.
Нужно протестировать поведение при обрыве соединения в процессе скачивания. Желательно делать это автоматически, то есть вручную делать kill myftpserver или выдергивание шнура из сетевой карты — не вариант.
Таким образом, мне нужно либо обрывать текущее соединение прямо на тестовом сервере, либо поднимать прокси, на нем ждать соединения и обрывать через секунду-другую. Не представляю, как это реализовать. Нужно хотя бы название утилиты или команды, которой я смогу отловить текущее соединение и оборвать его, либо блокировать все текущие соединения на заданный ip.
Разумеется, тестирую я на тестовом инстансе. К нему есть root-доступ по ssh.


Ответ

Думаю проще всего делать это с помощью iptables. Просто запрещать передавать пакеты, можно попробовать действия REJECT для быстрого обрыва или DROP для слета по таймауту.
Простейшее правило (если задается на машине где тестируемая прога) типа iptables -I OUTPUT -d ip-ftp-сервера -j REJECT Добавлять можно простеньким скриптом на shell периодически делая задержки sleep, например.
Или усложнить само правило и задействовать например connbytes
sudo iptables -I OUTPUT -d ip-ftp-сервера -m \ connbytes --connbytes 10000 --connbytes-dir both \ --connbytes-mode bytes -j REJECT
должно оборвать соединение после прокачки по нему 10 килобайт.
Если с iptables до этого не работали ... iptables -I добавляет правило. iptables -D с точно такими же параметрами, как были при добавлении - удаляет. iptables -L -nv покажет существующие правила

среда, 24 октября 2018 г.

FTP сервер возвращает ошибку 227

Доброго времени суток. Собственно, сабж в титле.
Сама ошибка выглядит по меньшей мере непонятно:
"Удаленный сервер возвратил ошибку: 227 Entering Passive Mode (192,168,1,136,39,43)"
при чём тут ошибка? мне же и нужно в пассивный режим зайти... ладно, едем дальше.
Опыта работы с ftp нет, нашел какие то исходники, собрал проект, выдаётся вышеупомянутое исключение. Упростил код до невозможности, ошибка осталась. Странность ещё в том, что в totalCommander соединение удаётся,
private void btn_connect_Click_2(object sender, RoutedEventArgs e) { FtpWebRequest requestDir = (FtpWebRequest)FtpWebRequest.Create("ftp://192.168.1.136/"); requestDir.Credentials = new NetworkCredential("username", "password"); requestDir.Method = "LIST"; requestDir.UseBinary = true; requestDir.EnableSsl = false; requestDir.UsePassive = true;
try { WebResponse response = requestDir.GetResponse(); } catch (Exception ex) { MessageBox.Show(ex.ToString() + ":
" + ex.Message); } }
пробовал так же ставить
requestDir.UsePassive = false;
Получил ошибку 500, синтаксическую, мол, команда не опознана. Буду благодарен, если мне объяснят, что я делаю не так)


Ответ

Задайте
requestDir.UsePassive = false;
Далее, в чем возможно заключается сама ошибка и почему сервер возвращает ошибку 500.
Дело в том что Вы задали команду вывода списка файлов:
requestDir.Method = "LIST";
Попробуйте сначала вывести список директорий:
requestDir.Method = WebRequestMethods.Ftp.ListDirectory;
или так:
requestDir.Method = "NLST";
Список предустановленных команд FTP в .NET: https://msdn.microsoft.com/ru-ru/library/system.net.webrequestmethods.ftp(v=vs.110).aspx