Как отправить файл на FTP-сервер, который не приведет к успешному завершению соединения?

(перемещен из SO)

Моя цель – загрузить файл на FTP-сервер во встроенное устройство. Файл представляет собой файл конфигурации. Как только файл будет принят, сервер перезагрузится. Что бросает вызов, так это то, что встроенное устройство выходит из сокета открытым или иным образом не завершает FTP-соединение.

Сервер выполняет ответ с кодом ответа 150, что означает «принято». Затем он перезагружается, но остается открытым.

Я ищу решение. Одним из решений является ручной код FTP-клиента на C, другой – использование встроенного FTP-клиента в UNIX через скрипт Bash. В комментариях ниже кто-то предложил curl или wget / wput.

Первая попытка

В моей первой попытке я решил написать FTP-клиент в C. Есть ли lib, который я могу использовать? Оглядываясь по сторонам, я вижу много сумасшедших библиотек, но, возможно, мне не хватает хорошего.

Вторая попытка

В другой попытке я попытался использовать сценарий Bash для работы с FTP-клиентом.

Следующая программа загружает файл, но затем он зависает

#!/bin/bash HOST=192.168.1.10 USER='blah' PASSWD='blah' FILE='file1.conf' ftp -n -i -v $HOST << EOT ascii user $USER $PASSWD put $FILE myconfig.conf bye EOT 

Вот что он говорит:

 Connected to 192.168.1.10 (192.168.1.10). 220 FTP server ready. 530 access denied. 331 Password required. 230 User logged in. local: somefile.txt remote: newname.txt 227 Entering Passive Mode (192,168,1,10,208,169) 150 ready to take file. 150 Accepting XML configuration file for upload. 818 bytes sent in 4.1e-05 secs (19951.22 Kbytes/sec) <it hangs here> 

Если я нажму Ctrl-Z, он уйдет. Если я отправил Ctrl-C или Ctrl-X, это не совсем так. И когда я делаю Ctrl-Z, он оставляет зависающий дочерний процесс, и мне приходится выполнять jobs -p | xargs kill -9 jobs -p | xargs kill -9 для очистки.

Третья попытка

Затем я попробовал curl :

$ curl -T file1.xml ftp://username:password@192.168.1.10/myfile.conf -v

Вот ответ:

 * Trying 192.168.1.10... % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Connected to 192.168.1.10 (192.168.1.10) port 21 (#0) < 220 FTP server ready. > USER admin < 331 Password required. > PASS PASS < 230 User logged in. > PWD < 257 "/" is current directory * Entry path is '/' > EPSV * Connect data stream passively * ftp_perform ends with SECONDARY: 0 < 500 command not supported. * Failed EPSV attempt. Disabling EPSV > PASV < 227 Entering Passive Mode (192,168,1,10,96,232) * Trying 192.168.1.10... * Connecting to 192.168.1.10 (192.168.1.10) port 24808 * Connected to 192.168.1.10 (192.168.1.10) port 21 (#0) > TYPE I < 200 command okay > STOR myfile.conf < 150 ready to take file. } [583 bytes data] * We are completely uploaded and fine * Remembering we are in dir "" < 150 Accepting XML configuration file for upload. * server did not report OK, got 150 100 583 0 0 100 583 0 4827 --:--:-- --:--:-- --:--:-- 4858 * Connection #0 to host 192.168.1.10 left intact curl: (18) server did not report OK, got 150 

Это было немного лучше. Когда я убиваю завиток, он не оставляет вещи, зависающие, как это делает клиент ftp .

Четвертая попытка

В этой попытке я попытался использовать wput . К моему большому удивлению, я получил ошибку сегментации.

 wput file1.conf ftp://username:password@192.168.1.10/myconfig.conf --09:37:50-- `file1.conf' => ftp://admin:xxxxx@192.168.1.10:21/myconfig.conf Connecting to 192.168.1.10:21... connected! Logging in as admin ... Logged in! ==> LIST ... done. Segmentation fault (core dumped) 

One Solution collect form web for “Как отправить файл на FTP-сервер, который не приведет к успешному завершению соединения?”

expect может обнаружить строку, bytes sent и в этот момент выйти из сценария:

 #!/usr/bin/env expect set HOST 192.168.1.10 set USER blah set PASSWD blah set FILE file1.conf spawn -noecho ftp -n -i -v $HOST # TODO possibly some error checking or prompt detection here... send "ascii\r" send "user $USER $PASSWD\r" send "put $FILE myconfig.conf\r" send "bye\r" set timeout 60 expect { # if paranoid confirm that the amount matches the size of file... -ex "bytes sent" { exit } timeout { exit 1 } eof { exit 1 } } 
  • Как использовать wget со списком URL-адресов и их соответствующими выходными файлами?
  • wget рекурсивный с файлами без расширения
  • Предотвращение зависания wget при обнаружении ошибки 500
  • Получение md5 во время wget
  • Загрузите, добавив после некоторого процентного завершения
  • Как запустить HTTP-запрос без использования CURL
  • Введите URL-адрес и статус HTTP-статуса
  • Как получить размер (deb) файла из ссылки для загрузки / URL?
  • Как загрузить определенные файлы с некоторого URL-адреса с помощью wget
  • Используя wget, загрузите веб-сайт, переведенный google translate
  • удалите бит на бит бит wget
  • Interesting Posts

    Не удалось создать логический раздел с помощью Parted

    Linux From Scratch: libgmp.la, libmpfr.la и libmpc.la не найдены во время проверки версии

    Не удается выполнить файлы на другом разделе

    Можно ли немедленно заставить Linux сохранять изменения, внесенные во внешние файлы жесткого диска?

    Использование команды eval дважды

    Как вызвать сброс сторожевого таймера моего встроенного Linux-устройства

    Postfix: пользователи выдают себя за других пользователей в одном домене

    Как получить код выхода процесса, который проходит через вино

    Диалоговое окно консоли консоли Bash с выходом команды

    Понять день в жизни сообщения журнала Apache в современной Linux-системе

    Android-устройство не может подключить Wi-Fi

    Есть ли способ получить часть каталога из переменной в make?

    Обновление ядра – требуется перезагрузка или нет?

    .Xresources именование имен и подстановочные знаки

    Как добавить дату ко всем файлам в каталоге, не касаясь подкаталогов через скрипт bash

    Linux и Unix - лучшая ОС в мире.