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

Google cloud storage 从Google云存储恢复以前版本的文件,google-cloud-storage,rsync,Google Cloud Storage,Rsync,我们使用地面军事系统进行异地备份,它一直工作得很好。 然而,我们的一台办公室电脑在周末感染了randsomware病毒,并对我们所有共享的网络文件进行了加密。问题是我们的备份脚本每天晚上都会进行rsync,并同步我们共享的网络文件,这意味着GCS上所有文件的实时版本现在都是加密的randsomware文件 我们使用版本控制并保留所有文件的4个版本。有没有办法将所有文件的前一版本恢复到实时版本?rsync没有自动恢复的选项。您需要列出对象的所有版本(使用gsutil ls-a),然后从每个版本中选

我们使用地面军事系统进行异地备份,它一直工作得很好。 然而,我们的一台办公室电脑在周末感染了randsomware病毒,并对我们所有共享的网络文件进行了加密。问题是我们的备份脚本每天晚上都会进行rsync,并同步我们共享的网络文件,这意味着GCS上所有文件的实时版本现在都是加密的randsomware文件


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

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

只是为了澄清问题中的情况,这只是一个假设,从使用地面军事系统作为我们的场外备份开始,我一直很想回答这个问题

在这种情况下,要获得恢复所需的结果,似乎唯一的方法是使用一些脚本来获取满足日期要求的文件列表。我发现google的generation ID是一个unix epoc时间戳,单位为微秒(不是毫秒)。这比Mike建议的解析时间戳更容易用作日期比较。不过,我最终还是使用了
gsutil ls
来获取要解析的文件列表,因为它非常简单快捷

一旦有了要使用脚本还原的文件列表,就可以将其输入到

cat restoreList.txt | gsutil cp-m-I/还原位置

因为我有点喜欢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);
})
const fs=require('fs');
var file=fs.readFileSync('./inputList.txt',utf8');
var regex=/(gs:.*)#(\d*)/;
var fileList={};
//确保并记住JS日期使用0-11表示月份,因此Feb=1
//此外,谷歌一代的ID以微秒为单位,所以我们需要乘以1000
const beforeThisDate=新日期(2018,1,8,5,30).getTime()*1000;
file.split('\n').forEach(行=>{
var found=line.match(regex);
如果(!发现)返回;
var fileName=找到[1];
var fileEpoc=found[2];
var fullPath=找到[0];
如果(!fileList[fileName]&&fileEpoc<在此日期之前){
fileList[fileName]={fileEpoc,fullPath};
返回;
}
if(fileList[fileName]&&fileEpoc{
log(文件列表[key].fullPath);
})

Mike,你有什么建议可以尝试建立一个文件列表并解析该列表以选择我要恢复的文件。使用
gsutil ls
似乎是一种效率较低的方法。Ian-如果您担心使用gsutil ls的效率,您可以编写一个直接调用API的工具(指定versions=true——请参见),选择每个对象的第二个最新对象(通过检查timeCreated),并输出该列表。然后,您可以将列表转换为一个脚本,在每个脚本上调用gsutil cp。