在shell脚本之间编写FTP脚本

时间:2015-03-27 04:26:59

标签: shell scripting ftp

我需要对文件files_to_download中提供的文件进行FTP。 我已经在它之间放了一个FTP脚本但它抛出并且错误说 "语法错误:文件结束意外(期待"完成")"。每次都需要进行FTP登录才能下载文件。我想在一次FTP登录中下载所有文件吗?

  if  [ $update -eq 1 ]
    then
        #echo "File needs to be updated"
        while read file_data
        do
            #echo $file_data
        file_name=`echo $file_data | cut -d':' -f1`  #truncate the file path
        echo $file_name

            #ftp -inv <<! 
            #open ${SERVER}
            #user ${USERNAME} ${PASSWORD}
            #binary
            #cd $REMOTEDIR
            #get server_version
            #lcd $LOCALDIR
            #close
            #quit
            #!    

        done < files_to_download   
fi

2 个答案:

答案 0 :(得分:1)

您可以使用这样的大纲脚本:

{
cat << EOF
open ${SERVER}
user ${USERNAME} ${PASSWORD}
binary
cd ${REMOTEDIR}
get server_version
EOF

sed -e 's/:.*//' -e 's/^/get /' files_to_download

cat <<EOF
lcd ${LOCALDIR}
close
quit
EOF    
} | ftp -inv

第一个cat设置连接。 sed将文件名列表编辑为get语句。最后的cat推出了剩余的命令。周围的{}将命令的所有输出发送到ftp命令。简单地省略所有第二个cat的可能性很小;在最终文件传输之后,FTP命令将在其输入上读取EOF,然后自行退出。

如果get server_version是文件名而不是FTP服务器版本请求,则可以删除server_versionlcd可能也没有必要。

我一直使用${VAR}符号;原始代码使用$VAR。一致性很好。

答案 1 :(得分:0)

你不应该缩进!,也就是说,你应该将它放在行的开头,而不要在它之前留下任何空格。你缩进它,所以它不被解析为heredoc的结尾。

要在一次登录中下载所有文件,您可以在子shell中打印FTP命令。或者,您也可以预先生成读取文件名并将其存储到变量中。