从 Google 云存储恢复以前版本的文件

Restore Previous Versions of Files From Google Cloud Storage

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

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

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

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

似乎要在这种情况下实现尝试恢复的预期结果的唯一方法是使用一些脚本来获取满足日期要求的文件的文件列表。我发现 google 的生成 ID 是一个以微秒(不是毫秒)为单位的 unix epoc 时间戳。这比像迈克建议的那样尝试解析时间戳更容易用作日期比较。然而,我确实最终使用 gsutil ls 来获取要解析的文件列表,因为它既快速又简单。

一旦您有了要使用脚本恢复的文件列表,您就可以将其输入

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

因为我有点像 brainlet JS 迷,所以我决定使用 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);
})