Bash 将大量内容流式处理到OVA

Bash 将大量内容流式处理到OVA,bash,sed,stream,pipe,Bash,Sed,Stream,Pipe,因此,我们的一位开发人员需要我批量处理一组信息,并将其处理成OVA,以供下载。这是一个使用long方法(即写入文件系统)的简单过程,但是开发人员希望有一个更干净、简化的解决方案,可以更好地扩展。因此,他们要求我对整个过程进行流式处理,这证明是困难的。谁能给我指点方向吗。以下是需要完成的步骤: 从Web服务器获取输入(Web服务器最终将这些作为流传递。) 随机密码 XML文件 修改文件系统上的启动脚本(即插入服务器生成的随机密码) 创建XML文件和引导脚本的ISO 计算ISO的SHA1和 将I

因此,我们的一位开发人员需要我批量处理一组信息,并将其处理成OVA,以供下载。这是一个使用long方法(即写入文件系统)的简单过程,但是开发人员希望有一个更干净、简化的解决方案,可以更好地扩展。因此,他们要求我对整个过程进行流式处理,这证明是困难的。谁能给我指点方向吗。以下是需要完成的步骤:

  • 从Web服务器获取输入(Web服务器最终将这些作为流传递。)
    • 随机密码
    • XML文件
  • 修改文件系统上的启动脚本(即插入服务器生成的随机密码)
  • 创建XML文件和引导脚本的ISO
  • 计算ISO的SHA1和
  • 将ISO的SHA1总和追加到OVF目录中的清单文件
  • 从OVF目录创建OVA
  • 下面是一个示例目录结构(为了简单起见,我在/中对此进行了概述)

    以下是我到目前为止的情况(我会在事后解释这些问题。是的……有很多问题):

    注意 在boot.sh中,有一个变量设置为默认值,如下所示(仅用于测试目的):

    注意 清单文件中的一行应该是这样的:

    SHA1(boot.iso)= 5fbc0d70 BLAH BLAH BLAH a91c9121bb
    
    因此,我以前从未尝试在一个流中编写整个脚本。通常,我在运行时经常向文件系统写入数据。我看到的第一个问题是sed正在替换字符串,但是它传递到mkisofs的内容不会被使用,因为mkiosfs只是将它在/iso中找到的内容制作成一个iso。我甚至不知道你是否能把这样的东西传给mkisofs。管道有时很奇怪

    接下来,我认为mkisofs是可以的,因为我没有指定文件输出,因此它应该输出到stdout,stdout将被传递到sha1sum,但是下面是我看到的下一个问题。我需要在添加SHA1总和之前向文件中添加一些额外的文本,这会中断流

    最后,我看到的最后一个问题是如何在不首先写入文件系统(写入manifest.mf)的情况下将所有要成为tar的内容传递到OVA中

    哦,我应该首先提到的最后一个大问题是config.xml文件。现在我只是把它当作一个文件来处理。开发人员也希望将其作为流传递给这个脚本。我不知道该怎么处理

    任何帮助都将不胜感激。这些概念有点超出我的知识范围

    谢谢

    美国东部时间2013年11月12日下午2:11更新

    现在分别测试每个部件。我们将很快在下面报告调查结果

    美国东部时间2013年11月12日下午2:14更新

    以下工作:

    cat /ISO/boot.sh | sed "s%DEFAULT%RANDOM%"
    
    并生成以下输出:

    RANDOM="RANDOM"
    
    一如所料

    你是对的NeronLeVelu,当生成真正的随机密码时,我必须稍后回来更仔细地查看sed。即,确保转义正确的字符。不过现在,我只是在测试逻辑。我会担心regex和以后逃跑。我们甚至还没有决定随机密码。这只是暂时的,很可能是字母数字

    进入下一部分。仍然不确定如何从sed(stdout)获取输出并使用它包含在ISO创建中,而不实际创建写入文件系统的文件。如果不写入文件系统,这可能是不可能的。很快就会有更多

    # for the password if it contain & \ and separator used in your sed (default is /)
    Password4Sed="`echo \"${PASSWORD} | sed \"s/[\\/&]/\\\\&/g\"`"
    
    
    # no need of a cat with a sed
    sed "s/DEFAULT/${Password4Sed}/"/ISO/boot.sh > /tmp/mkisofs.input
    

    处理此输入的其余部分,并进行一些测试以验证每个步骤,如空crc值或mkisofs.input。这将有助于在运行时出现大量生产错误。我建议将你的问题分解成真正简单的测试来证明自己,例如“如果你能通过类似的测试”。如果它不能处理你能想到的最简单的情况,那么你必须先解决它,然后再把它复杂化。根据需要重复+对于fmtd和解释好的问题,我只有1个答案,但我没有时间尝试解析所有这些。祝你好运如果你能更好地定义你的“开发人员”所指的规模,这将有所帮助。快一点?和/或类似线程的方法(一次多个作业),和/或。。。。。只需阅读关于XML文件作为流的部分。再一次,另一个原因是尽可能地打破这一点,并试图证明基本思想是可行的。如果您可以执行
    cat file.xml | stream_进程
    ,并且
    stream_进程
    可以解析出xml文件的开始和结束,那么您就有了希望。祝你好运。他们希望流式处理,因为它可能需要在某个点扩展到大量请求。记住,这是为客户定制OVA包装而设计的。打包后,它会将其呈现供下载。需要流式传输以帮助扩展到大量请求。Sed对多个任务有“某些”限制,并且在您的情况下,密码不是一个regex模式,这意味着其他内容。在s//的替换部分中,不能有未转义的&\和模式分隔符。(字母数字值没有问题)从午餐回来。我将继续在上面的帖子中添加更新。谢谢你的帮助。嗯,好的,试着消化你的部分答案。谢谢你的帮助。
    cat /ISO/boot.sh | sed "s%DEFAULT%RANDOM%"
    
    RANDOM="RANDOM"
    
    # for the password if it contain & \ and separator used in your sed (default is /)
    Password4Sed="`echo \"${PASSWORD} | sed \"s/[\\/&]/\\\\&/g\"`"
    
    
    # no need of a cat with a sed
    sed "s/DEFAULT/${Password4Sed}/"/ISO/boot.sh > /tmp/mkisofs.input