2015-06-19 89 views
0

我想編寫一個從Linux到Windows FTP服務器的文件傳輸的複雜場景(檢測新的/更改的文件,然後傳輸),並且我無法找到命令-line ftp客戶端,它支持在非交互模式下通過永久(一次登錄)會話發送文件。在shell腳本中使用的持久非交互式FTP會話

ssh/scp無密碼驗證不是一個選項,因爲我無法訪問Windows FTP服務器。

例如使用lftp

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

將上傳我的文件服務器,但需要驗證/握手每個請求,這需要很長的時間,嚴重會減慢轉移的情況發生。

我想知道是否有一種方法來驗證一次,建立一個持久連接,然後通過此連接發送文件。 lftp和其他客戶端都可以在交互模式下執行此操作(連接,然後執行多個命令直至退出)。

因此:

  • 是否有在Linux上的FTP客戶端可以像這樣在非交互模式下運行?
  • 另外,有沒有一種方法來模擬這種行爲,在交互模式下編寫腳本?也許有些東西利用expectnetcat/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

是否有'expect'中的命令執行錯誤處理並分支到spawn命令?在一個shell腳本中,例如'attempt_transfer || respawn' – henfiber