Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 批量更改Google云存储ACL权限_Php_Google App Engine_Google Cloud Storage - Fatal编程技术网

Php 批量更改Google云存储ACL权限

Php 批量更改Google云存储ACL权限,php,google-app-engine,google-cloud-storage,Php,Google App Engine,Google Cloud Storage,我一直在通过与云存储桶直接关联的应用程序引擎制作具有以下ACL属性的文件 $options = stream_context_create(['gs'=>['acl'=>'private']]); 如果我想编辑和查看应用程序引擎脚本中的文件,这很好。然而,我希望能够从一个完全不同的谷歌应用程序引擎项目ID,甚至是一个计算引擎访问这些文件 由于当前ACL设置为私有,我意识到这可能是不可能的 在具有这些私有ACL文件的bucket中,我将不同项目ID的bucket权限设置为owner,

我一直在通过与云存储桶直接关联的应用程序引擎制作具有以下ACL属性的文件

$options = stream_context_create(['gs'=>['acl'=>'private']]);
如果我想编辑和查看应用程序引擎脚本中的文件,这很好。然而,我希望能够从一个完全不同的谷歌应用程序引擎项目ID,甚至是一个计算引擎访问这些文件

由于当前ACL设置为私有,我意识到这可能是不可能的

在具有这些私有ACL文件的bucket中,我将不同项目ID的bucket权限设置为owner,对于未设置为private的文件,它可以正常工作

我想知道是否还有其他方法可以将bucket中的所有文件批量更改为正确的ACL。我有成百上千的文件,很难一个接一个地处理。现在,如果我点击一个文件并查看它的权限,那里什么都没有(因此是私有的)


这就是当我尝试使用
gsutil

$ gsutil acl get gs://bucket/file
AccessDeniedException: Access denied. Please ensure you have OWNER permission on gs://bucket/file

这是使用
gsutil ch
命令添加用户组时得到的结果

$ gsutil acl ch -u <project_id>@appspot.gserviceaccount.com:W gs://bucket/file
ERROR 0313 15:29:18.896421 retry_decorator.py] Retrying in 1.00 seconds ...
Traceback (most recent call last):
File "/usr/lib/google-cloud-sdk/platform/gsutil/third_party/retry-decorator/retry_decorator/retry_decorator.py", line 20, in f_retry
return f(*args, **kwargs)
File "/usr/lib/google-cloud-sdk/platform/gsutil/gslib/commands/acl.py", line 372, in ApplyAclChanges
fields=['acl', 'generation', 'metageneration'])
File "/usr/lib/google-cloud-sdk/platform/gsutil/gslib/cloud_api_delegator.py", line 199, in GetObjectMetadata
bucket_name, object_name, generation=generation, fields=fields)
File "/usr/lib/google-cloud-sdk/platform/gsutil/gslib/gcs_json_api.py", line 513, in GetObjectMetadata
generation=generation)
File "/usr/lib/google-cloud-sdk/platform/gsutil/gslib/gcs_json_api.py", line 1018, in _TranslateExceptionAndRaise
raise translated_exception
AccessDeniedException: AccessDeniedException: 403 Forbidden
ERROR 0313 15:29:19.995003 retry_decorator.py] Retrying in 2.05 seconds ...
Traceback (most recent call last):
File "/usr/lib/google-cloud-sdk/platform/gsutil/third_party/retry-decorator/retry_decorator/retry_decorator.py", line 20, in f_retry
return f(*args, **kwargs)
File "/usr/lib/google-cloud-sdk/platform/gsutil/gslib/commands/acl.py", line 372, in ApplyAclChanges
fields=['acl', 'generation', 'metageneration'])
File "/usr/lib/google-cloud-sdk/platform/gsutil/gslib/cloud_api_delegator.py", line 199, in GetObjectMetadata
bucket_name, object_name, generation=generation, fields=fields)
File "/usr/lib/google-cloud-sdk/platform/gsutil/gslib/gcs_json_api.py", line 513, in GetObjectMetadata
generation=generation)
File "/usr/lib/google-cloud-sdk/platform/gsutil/gslib/gcs_json_api.py", line 1018, in _TranslateExceptionAndRaise
raise translated_exception
AccessDeniedException: AccessDeniedException: 403 Forbidden
AccessDeniedException: 403 Forbidden
$gsutil acl ch-u@appspot.gserviceaccount.com:W gs://bucket/file
错误0313 15:29:18.896421重试\u decorator.py]在1.00秒后重试。。。
回溯(最近一次呼叫最后一次):
文件“/usr/lib/googlecloudsdk/platform/gsutil/third_party/retry decorator/retry_decorator/retry_decorator.py”,第20行,在f_retry中
返回f(*args,**kwargs)
ApplyAclChanges中的文件“/usr/lib/google cloud sdk/platform/gsutil/gslib/commands/acl.py”,第372行
字段=['acl'、'generation'、'metageneration'])
GetObjectMetadata中的文件“/usr/lib/google cloud sdk/platform/gsutil/gslib/cloud_api_delegator.py”,第199行
bucket\u name,object\u name,generation=generation,fields=fields)
GetObjectMetadata中的文件“/usr/lib/google cloud sdk/platform/gsutil/gslib/gcs_json_api.py”,第513行
世代=世代)
文件“/usr/lib/google cloud sdk/platform/gsutil/gslib/gcs_json_api.py”,第1018行,在
引发异常
AccessDeniedException:AccessDeniedException:403禁止
错误0313 15:29:19.995003重试\u decorator.py]在2.05秒内重试。。。
回溯(最近一次呼叫最后一次):
文件“/usr/lib/googlecloudsdk/platform/gsutil/third_party/retry decorator/retry_decorator/retry_decorator.py”,第20行,在f_retry中
返回f(*args,**kwargs)
ApplyAclChanges中的文件“/usr/lib/google cloud sdk/platform/gsutil/gslib/commands/acl.py”,第372行
字段=['acl'、'generation'、'metageneration'])
GetObjectMetadata中的文件“/usr/lib/google cloud sdk/platform/gsutil/gslib/cloud_api_delegator.py”,第199行
bucket\u name,object\u name,generation=generation,fields=fields)
GetObjectMetadata中的文件“/usr/lib/google cloud sdk/platform/gsutil/gslib/gcs_json_api.py”,第513行
世代=世代)
文件“/usr/lib/google cloud sdk/platform/gsutil/gslib/gcs_json_api.py”,第1018行,在
引发异常
AccessDeniedException:AccessDeniedException:403禁止
AccessDeniedException:403禁止

我假设我可能必须编写一个php脚本,在我的应用程序引擎中运行,该脚本遍历每个文件并更改或添加权限

非常感谢您提供的任何帮助。

您可以运行以更改对所有文件的访问权限,或仅更改与某些模式匹配的文件的访问权限

确保您进行了身份验证,否则gsutil将无法访问您的存储桶:

ACL设置为private时,只有创建对象的AppEngine服务帐户才能修改ACL

您可能需要使用AppEngine编写程序并在AppEngine上执行


或者,我认为默认的GCE服务帐户是与AppEngine共享的,因此,如果您使用devstorage.full\u控制范围创建虚拟机,我认为您应该能够在虚拟机内使用gsutil修改ACL。

我在尝试获取权限时遇到以下错误,因此我怀疑这是否可行,还有其他建议吗<代码>$gsutil acl get gs://bucket/file AccessDeniedException:访问被拒绝。请确保您拥有gs://bucket/file的所有者权限,在gsutil访问您的bucket之前,您需要进行身份验证:您的行为就像我没有访问我的bucket的权限一样。我当然被认证了。计算引擎立即通过身份验证。我只是不是计算机引擎中文件的所有者。计算机引擎与此无关。只要您对gsutil进行身份验证,就可以从任何计算机访问对象(无论您是否经过身份验证)。按照gsutil身份验证页面上的说明进行操作,它将正常工作。我一直在用它,我就是这么想的。你知道我可以在appengine中立即使用这个命令来更改文件路径的ACL吗?这完全是错误的。我一直通过gsutil将ACL从私有更改为公共。@AndreiVolgin只有当您是对象的所有者时才有效。在这种情况下,所有者是AppEngine服务帐户,而不是用户。@AndreiVolgin-您的对象可能被设置为
project private
(默认值)的ACL,该ACL允许项目的任何所有者修改ACL。这些对象被创建为
private
,这只允许所有者(在本例中为AppEngine服务帐户)修改ACL。您可以从中获取访问代码,而不是使用用户身份验证。然后,您可以迭代对象(
$storageService->objects->listObjects
)并使用
'acl'=>NULL
'predefinedAcl'=>'projectPrivate'
来修补它们的acl(
$storageService->object->patch
),以预定义的acl替换acl。