azcopy - 远程服务器返回403禁止

时间:2013-08-10 17:07:21

标签: azure

我有几个Azure帐户。我想将一个大博客(250GB vhd)从一个帐户复制到另一个帐户,无需下载,然后上传到本地计算机或从本地计算机上传。

我尝试使用Microsoft实用程序AZCOPY执行此操作(键替换为x):

azcopy https://accountfrom.blob.core.windows.net/neo4j/neo4j-250gb.db.vhd https://accountto.blob.core.windows.net/neo4j/neo4j-250gb.db.vhd / DestKey:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx / SourceKey:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

但是这给了我错误信息: 解析目标位置时出错远程服务器返回错误:(403)Forbidden。

我通过在CloudBerry中打开帐户来测试密钥和帐户。我也从CloudBerry获得了网址,所以我认为我也做到了这些。

403可能是什么原因?

7 个答案:

答案 0 :(得分:3)

我试过Gaurav建议使用Fiddler。这让我可以看到Azure存储的XML响应。在那里,我看到“AuthenticationErrorDetail:请求日期标题太旧”原来我正在使用虚拟机,它的时间落后了。更新VM上的时钟修复了授权问题。

答案 1 :(得分:1)

AzCopy命令行模式是" azcopy [source] [dest] [文件模式] [选项]", [source]将被视为文件夹(如果从本地文件夹复制) )或虚拟目录(如果从blob中复制),,即AzCopy将复制源文件夹/虚拟目录下的所有文件。

因此,在您的命令行中,azcopy将尝试查找等于' xxxx.core.windows.net/neo4j/neo4j-250gb.db.vhd'的虚拟目录,但我们知道它不是一个虚拟的目录,但文件。

要从blob复制单个文件,可以使用[file pattern]和选项/ s尝试以下命令。

azcopy accountfrom.blob.core.windows.net/neo4j/ accountto.blob.core.windows.net/neo4j/ /sourcekey:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx /destkey:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx neo4j-250gb.db.vhd /s

注意,从blob'复制之间的文件模式不同。并从本地文件夹' 复制。从blob复制时,文件模式被视为前缀,从本地复制时,文件模式是一般文件系统文件模式。

  

E.g。您可以使用文件模式ab *从本地复制时指定所有   文件以' ab'开头,但是从blob复制时,您只能指定   前缀如' ab'。

有关如何使用选项/ s,请转到http://blogs.msdn.com/b/windowsazurestorage/archive/2012/12/03/azcopy-uploading-downloading-files-for-windows-azure-blobs.aspx

对于错误' 403 forbidden',它与您使用的命令行模式无关,但与密钥或帐户有关。

最后但并非最不重要的是,您始终可以在aka.ms/azcopy

获取最新的azcopy

答案 2 :(得分:1)

不仅要检查目标 Blob,还要检查 Blob的SAS令牌权限。

enter image description here

答案 3 :(得分:0)

您是否尝试过CopyFromBlob方法?我不确定它是否适用于订阅,如果我有多个订阅,我会测试它。但它非常快,并没有上下。

这样的事情:

//set the azure container
string sourceContainerName = "mySourceContainer";
string destinationContainerName = "myDestinationContainer";
//azure connection string
string sourceSettingKey = string.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}", "xxxx",
                                            "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
string destinationSettingKey = string.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}", "xxxx",
                                            "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
//setup the container object
CloudStorageAccount sourceStorageAccount = CloudStorageAccount.Parse(sourceSettingKey);
CloudStorageAccount destinationStorageAccount = CloudStorageAccount.Parse(destinationSettingKey);
CloudBlobClient sourceClient = sourceStorageAccount.CreateCloudBlobClient();
CloudBlobClient destinationClient = destinationStorageAccount.CreateCloudBlobClient();
CloudBlobContainer sourceContainer = blobClient.GetContainerReference(sourceContainerName);
CloudBlobContainer destinationContainer = blobClient.GetContainerReference(destinationContainerName);

// Set permissions on the container.
BlobContainerPermissions permissions = new BlobContainerPermissions();
permissions.PublicAccess = BlobContainerPublicAccessType.Blob;
sourceContainer.SetPermissions(permissions);
destinationContainer.SetPermissions(permissions);

//grab the blob
CloudBlob sourceBlob = sourceContainer.GetBlobReference("mySourceBlobName");
CloudBlob destinationBlob = destinationContainer.GetBlobReference("myDestinationBlobName");
//create a new blob
destinationBlob.CopyFromBlob(sourceBlob);

答案 4 :(得分:0)

我得到了403,因为我使用的第一个密钥(为存储帐户生成)在某种程度上有缺陷。 只需更改为使用第二个键就可以解决问题 - 当然还可以重新生成第一个键。

答案 5 :(得分:0)

AzCopy需要从中复制文件的存储容器,而不是文件的完整路径。

因此,

AzCopy /Source:https://accountfrom.blob.core.windows.net/neo4j /Dest:https://accountto.blob.core.windows.net/neo4j /SourceKey:key /DestKey:key /Pattern:neo4j-250gb.db.vhd

/Pattern指的是要复制的文件。默认情况下,跨天蓝色存储复制的文件在服务器端完成。看到 https://docs.microsoft.com/en-us/azure/storage/common/storage-use-azcopy#copy-blobs-in-blob-storage了解更多信息。

答案 6 :(得分:0)

首次创建时,需要以SAS密钥生成形式以允许的“资源类型”检查“对象”。 调试的默认方式是获取所有已选中的SAS密钥,如果可以工作,则将其精简。