Homebrew:使用BASH和GPG从存储库中提取更新

时间:2015-06-04 20:05:24

标签: linux bash encryption automatic-updates

我有一队Linux计算机("节点"从现在开始),这些我称之为网络的短暂成员。这些节点是车载的,经常进出wifi覆盖范围。

当然,将单个脚本,程序或文件的更新推送到所有节点对我来说通常都是有益的。我想出的是:

  1. 生成要由所有节点共享的密钥对
  2. 在我的工作站上使用包含安装路径的标头加密新文件版本。我的工作站当然有公钥。
  3. 将加密的更新放置在可通过节点访问的网络中,然后将#34; staging"夹
  4. 当节点发现自己具有良好的连接时,它会检查暂存文件夹。
  5. 如果新文件,他们会:
    • 已复制到节点
    • 解密
    • 检查完整性("文件标题看起来不错?")
    • 移至标题
    • 规定的位置
  6. 这是我的代码的简单版本。这是一个坏主意吗?是否有一种更优雅的方式来处理在超级连接上更新无人值守节点?

      #!/bin/bash
        #A method for autonomously retrieving distributed updates
    
        #The latest and greatest files are here:
        stageDir="/remoteDirectory/stage"
        #Files are initially moved to a quarantine area
        qDir="/localDirectory/quarantine"
        #If all went well, put a copy of the encrypted file here:
        aDir="/localDirectory/pulled"
        #generic extension for encrypted files "Secure Up Date"
        ext="sud"
    
        for file in "$stageDir"/*."$ext"; do    #For each "sud" file...
            fname=$(basename $file)
            if [ ! -f $aDir/$fname ]; then  #If this file has not already been worked on...
                cp "$file" "$qDir"/"$fname" #Move it to the quarantine directory
            else
                echo "$fname has already been pulled"   #Move along
            fi
        done
    
        if [ "$(ls $qDir)" ]; then  #If there's something to do (i.e. files in the directory)
            for file in "$qDir"/*."$ext"; do
                fname=$(basename $file)
                qPath="$qDir/$fname"
                untrusted="$qPath.untrusted"
                #Decrypt file
                gpg --output "$untrusted" --yes --passphrase "supersecretpassphrase" --decrypt "$qPath" #Say yes to overwriting
                headline=$(head -n 1 $untrusted)    #Get the header (which is the first line of the file)
                #Check to see if this is a valid file
                if [[ $headline == "#LOOKSGOOD:"* ]]; then  #All headers must start with "#LOOKSGOOD:" or something
                    #Get install path
                    installPath=$(echo $headline | cut -d ':' -f 2) #Get the stuff after the colon
                    tail -n +2 $untrusted > $installPath    #Send everything but the header line to the install path
                    #Clean up our working files
                    rm $untrusted
                    mv $qPath "$aDir/$fname"
                    #Report what we did
                    echo $headline
                else
                    #trash the file if it's not a legit file
                    echo "$fname is not a legit update...trashing it"
                    rm "$qDir/$fname"*
                fi
            done
        fi
    

0 个答案:

没有答案