【问题标题】:Write a FTP script in between shell script在 shell 脚本之间写一个 FTP 脚本
【发布时间】:2024-04-27 12:20:02
【问题描述】:

我需要对文件 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

【问题讨论】:

    标签: shell scripting ftp


    【解决方案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,然后自行退出。

    如果 server_version 是一个文件名而不是对 FTP 服务器版本的请求,则可以删除 get server_versionlcd 可能也不是必需的。

    我一直使用${VAR} 表示法;原始代码使用$VAR。一致性很好。

    【讨论】:

      【解决方案2】:

      你不应该缩进!,也就是说,你应该把它放在行首,前面没有任何空格。你缩进了它,所以它不会被解析为heredoc的结尾。

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

      【讨论】:

      • 是的,我知道了@user4098326...我做了适当的缩进,现在没有错误。有什么方法可以进行单次 FTP 登录而不是循环进行 FTP 登录?
      • 在上面的脚本中,我需要在 FTP 脚本的“get file_name”行中替换 $file_name 的值。这可能吗?
      • @SowmyaManmathan:是的。让脚本生成登录的序言、get 命令列表和关闭/退出序列,并将其提供给ftp 命令。一次登录...足够了。是的,您可以在此处的文档中扩展文件名。
      • @JonathanLeffler 。我不完全明白。