2014-12-01 125 views
3

我在寫一個bash腳本來將文件從linux服務器發送到遠程Windows FTP服務器。 我想檢查使用FTP,如果文件將被存儲的文件夾存在之前嘗試創建它。 請注意,我不能使用SSH和SCP,也無法在Linux服務器上安裝新腳本。另外,對於性能問題,我更希望如果僅使用一個FTP連接檢查和創建文件夾。Bash:檢查是否存在使用FTP的遠程目錄

這裏的功能來發送文件:

sendFile() { 
    ftp -n $FTP_HOST <<! >> ${LOCAL_LOG} 
     quote USER ${FTP_USER} 
     quote PASS ${FTP_PASS} 
     binary 
     $(ftp_mkdir_loop "$FTP_PATH") 
     put ${FILE_PATH} ${FTP_PATH}/${FILENAME} 
     bye 
! 
} 

而這裏的ftp_mkdir_loop樣子:

ftp_mkdir_loop() { 
    local r 
    local a 
    r="[email protected]" 
    while [[ "$r" != "$a" ]]; do 
     a=${r%%/*} 
     echo "mkdir $a" 
     echo "cd $a" 
     r=${r#*/} 
    done 
} 

ftp_mkdir_loop功能在$FTP_PATH創建所有的文件夾可以幫助(因爲我不能做mkdir -p $FTP_PATH通過FTP)。

總的來說,我的腳本工作,但不是「乾淨」;這就是我得到在我的日誌文件中的腳本執行後(是的,$FTP_PATH由5個現有的目錄):

(directory-name) Cannot create a file when that file already exists. 
Cannot create a file when that file already exists. 
Cannot create a file when that file already exists. 
Cannot create a file when that file already exists. 
Cannot create a file when that file already exists. 

回答

1

爲了解決這個問題,請執行以下操作:

  1. 要確保你只使用一個FTP連接,您創建輸入(FTP命令)作爲shell腳本的

    例如輸出

    $ cat a.sh 
    cd /home/test1 
    mkdir /home/test1/test2 
    
    $ ./a.sh | ftp $Your_login_and_server > /your/log 2>&1 
    
  2. 要允許FTP測試是否存在一個目錄,您使用「DIR」命令寫入文件

    # ...continuing a.sh 
    # In a loop, $CURRENT_DIR is the next subdirectory to check-or-create 
    echo "DIR $CURRENT_DIR $local_output_file" 
    sleep 5 # to leave time for the file to be created 
    if (! -s $local_output_file) 
    then 
        echo "mkdir $CURRENT_DIR" 
    endif 
    

    選項的事實請注意,"-s"測試不一定正確 - 我現在沒有acccess to ftp,也不知道在非現有目錄上運行DIR的確切輸出是什麼 - cold是空文件,可能是一個特定的錯誤。如果錯誤,你可以grep在$ local_output_file錯誤文本現在

  3. ,包裹步驟#2成一個圈在你的個人子目錄a.sh

+0

具有諷刺意味的是,sftp不支持寫入本地文件,所以這個解決方案只適用於純FTP ftp – DVK 2014-12-29 20:39:20

+0

我無法實現這個解決方案。你能否詳細說明一下?我仍然不是很多用bash腳本編寫的。 – grim 2014-12-30 16:36:37

+0

當我執行'DIR $ CURRENT_DIR $ local_output_file'時''無效的命令' $ local_output_file究竟是什麼? – grim 2014-12-30 16:54:22

1
#!/bin/bash 

    FTP_HOST=prep.ai.mit.edu 
    FTP_USER=anonymous 
    [email protected] 
    DIRECTORY=/foo     # /foo does not exist, /pub exists 
    LOCAL_LOG=/tmp/foo.log 
    ERROR="Failed to change directory" 

    ftp -n $FTP_HOST << EOF | tee -a ${LOCAL_LOG} | grep -q "${ERROR}" 
    quote USER ${FTP_USER} 
    quote pass ${FTP_PASS} 
    cd ${DIRECTORY} 
    EOF 

    if [[ "${PIPESTATUS[2]}" -eq 1 ]]; then 
     echo ${DIRECTORY} exists 
    else 
     echo ${DIRECTORY} does not exist 
    fi 

輸出:

 
/foo does not exist 


如果您想僅抑制 ${LOCAL_LOG}中的消息:

ftp -n $FTP_HOST <<! | grep -v "Cannot create a file" >> ${LOCAL_LOG} 
+0

是建議在這裏,他應該被執行每個目錄組件使用'cd'測試一個ftp連接,然後每個不存在的組件使用'mkdir',然後再傳輸一個文件? – 2014-12-26 12:34:21

+1

使用'$ PIPESTATUS'檢查FTP中的錯誤的創意答案。但是在@EtanReisner評論之後,似乎會有太多的FTP連接。此外,我最終想檢查文件夾的存在,並創建它們只有一個FTP連接。 – grim 2014-12-27 18:37:17

+0

如果沒有更好的答案,因爲我剛剛瞭解了「$ PIPESTATUS」,而且我們僅僅抑制消息的次要答案令人滿意,但我並不完全回答我的問題,所以如果沒有更好的答案,我會在期末獎賞您的賞金。 – grim 2014-12-27 18:40:45