2014-12-01 83 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

相关问题