从Google云端存储还原以前版本的文件

时间:2018-02-14 20:10:15

标签: google-cloud-storage rsync

我们使用GCS进行异地备份,效果很好。 然而,我们的一台办公室计算机在周末感染了一个randsomware病毒并加密了我们所有的共享网络文件。问题是我们的备份脚本每天晚上都会执行rsync并同步我们的共享网络文件,这意味着GCS上所有文件的实时版本现在都是加密的randsomware文件。

我们使用版本控制并保留所有文件的4个版本。有没有办法恢复所有文件的实时版本之前的版本?

2 个答案:

答案 0 :(得分:2)

rsync没有自动执行此操作的选项。您需要列出对象的所有版本(使用gsutil ls -a),然后从每个版本中选择最新的版本。

答案 1 :(得分:0)

只是为了澄清问题中发布的情况只是一个假设,我一直很好奇自从转而使用GCS作为我们的异地备份后试图回答。

在这种情况下,尝试恢复所需的唯一方法是使用某些脚本来获取满足日期要求的文件的文件列表。我发现谷歌的生成ID是一个unix epoc时间戳,以微秒为单位(非毫秒)。这比使用Mike建议的解析时间戳更容易用作日期比较。但我最终使用gsutil ls来解析文件列表,因为它只是快速而简单。

使用脚本恢复文件列表后,您可以将其输入

cat restoreList.txt | gsutil cp -m -I /restore-location

由于我是一个小脑袋JS junkie我决定使用Node.js编写我的脚本,即使使用类似Python的东西也一样容易。

const fs = require('fs');

var file = fs.readFileSync('./inputList.txt', 'utf8');

var regex = /(gs:.*)#(\d*)/;
var fileList = {};

// Make sure and remember that JS Dates use the 0-11 notation for months so Feb = 1
// Also google generation IDs are in microseconds so we need to multiply by 1000
const beforeThisDate = new Date(2018, 1, 8, 5, 30).getTime() * 1000;

file.split('\n').forEach(line => {
  var found = line.match(regex);
  if(!found) return;
  var fileName = found[1];
  var fileEpoc = found[2];
  var fullPath = found[0];
  if(!fileList[fileName] && fileEpoc < beforeThisDate) {
    fileList[fileName] = {fileEpoc, fullPath};
    return;
  }
  if(fileList[fileName] && fileEpoc < beforeThisDate && fileList[fileName].fileEpoc < fileEpoc) {
    fileList[fileName] = {fileEpoc, fullPath};
    return;
  }
  return;
})

Object.keys(fileList).forEach(key => {
  console.log(fileList[key].fullPath);
})