2015-06-19 7 views
0

Я хотел бы сценарий сложного сценария передачи файлов из Linux на FTP-сервер Windows (обнаружение новых/измененных файлов, а затем передача), и я не могу найти команду -line ftp client, который поддерживает отправку файлов через постоянный сеанс (один раз) в неинтерактивном режиме.Постоянная неинтерактивная сессия FTP для использования в сценариях оболочки

ssh/scp с аутентификацией без пароля не является вариантом, так как у меня нет доступа к FTP-серверу Windows.

Например, используя lftp

`lftp -u user,pass -p 21 -e "mput newfile.txt;"` 10.0.0.100 

будет загрузить файл на сервер, но требует аутентификации/квитирования произойти при каждом запросе, который занимает много времени и сильно замедляет передачу.

Мне интересно, есть ли способ аутентификации один раз, установить постоянное соединение и затем отправить файлы по этому соединению. lftp и другие клиенты могут сделать это в интерактивном режиме (подключиться, а затем выполнить несколько команд до выхода из игры).

Поэтому:

  • Есть ли FTP-клиент на Linux, который может работать, как это в не интерактивном режиме?
  • В качестве альтернативы, есть ли способ имитировать это поведение, используя сценарий в интерактивном режиме? Может быть, что-то использует expect с netcat/telnet и/или именованными трубами?
+1

Помимо автоматизации ввода пароля, LFTP может быть сценарий уже: https://web.archive.org/web/20111024014512/http://tutorials.papamike.ca/pub/lftp.html #scripts –

+0

Многие языки используют FTP-клиенты, поэтому вы можете создавать как достаточно сложные скрипты, как вам нравится: [Tcl] (http://core.tcl.tk/tcllib/doc/trunk/embedded/www/tcllib/files/modules /ftp/ftp.html), [Perl] (https://metacpan.org/pod/Net::FTP), [Ruby] (http://ruby-doc.org/stdlib-2.2.2/libdoc/ net/ftp/rdoc/Net/FTP.html), [Python] (https://docs.python.org/3/library/ftplib.html?highlight=ftp#module-ftplib) –

+0

@glennjackman Я знаю, что ' lftp' может читать набор из команд из файла и что я могу также передавать в него несколько команд, но это не решает, чего я хочу достичь. Как я уже сказал, я хочу загружать файлы, когда они становятся доступными (обнаружение новых/измененных файлов). Таким образом, я не могу предварительно заполнить скрипт командами, я должен инициировать новую передачу, когда файлы обнаружены. Именно по этой причине я хочу, чтобы сессия была открытой, чтобы не пересоединяться все время. – henfiber

ответ

1

непроверенная, но вы можете сделать что-то вроде этого: Tcl

package require ftp 
set conn [ftp::Open server user pass] 
while true { 
    after 5000   ;# sleep 5 seconds 
    foreach newfile [glob -nocomplain *] { 
     puts "sending $newfile" 
     ftp::Put $newfile 
     file delete $newfile 
    } 
} 

ожидать было бы похоже. непроверенные:

set timeout -1 
spawn lftp -u user,pass server 
expect "> " 
while true { 
    sleep 5 
    foreach newfile [glob -nocomplain *] { 
     puts "sending $newfile" 
     send "put $newfile\r" 
     expect "> " 
     file delete $newfile 
    } 
    send "\r"   ;# "hit enter" as a keep-alive 
} 
+0

Спасибо, Гленн. Как я могу убедиться, что соединение сохранено в живых?И если это не так, перезапустите его в цикле, затем продолжите отправку новых файлов – henfiber

+0

, вам нужно будет проверить результат или результат «put», если есть ошибка, вы будете возвращаться к повторному запуску –

+0

команда в 'ожидать', которая выполняет обработку ошибок и ветвление к команде spawn? В сценарии оболочки, который будет, например, 'try_transfer || respawn' – henfiber