#!/usr/bin/env python
#remove public read right for all keys within a directory
#usage: remove_public.py bucketName folderName
import sys
import boto
bucketname = sys.argv[1]
dirname = sys.argv[2]
s3 = boto.connect_s3()
bucket = s3.get_bucket(bucketname)
keys = bucket.list(dirname)
for k in keys:
new_grants = []
acl = k.get_acl()
for g in acl.acl.grants:
if g.uri != "http://acs.amazonaws.com/groups/global/AllUsers":
new_grants.append(g)
acl.acl.grants = new_grants
k.set_acl(acl)
在AWS S3存储桶列表(AWS S3用户界面)中,您可以通过将整个文件夹内容公开来手动公开一个文件 or 来修改 individual 文件的权限(澄清一下,我指的是存储桶中的文件夹) . 要将公共属性恢复为私有,请单击该文件,然后转到权限并单击"EVERYONE" Headers 下的径向按钮 . 你得到第二个浮动窗口,你可以取消选中* read object " attribute. Don't forget to save the change. If you try to access the link, you should get the typical " Access Denied“消息 . 我附上了两个截图 . 第一个显示文件夹列表 . 单击文件并按照上述步骤显示第二个截图,显示了4个步骤 . 请注意,要修改多个文件,需要使用之前帖子中提出的脚本 . -Kf
#!/usr/bin/env python
#remove public read right for all keys within a directory
#usage: remove_public.py bucketName folderName
import sys
import boto
bucketname = sys.argv[1]
dirname = sys.argv[2]
s3 = boto.connect_s3()
bucket = s3.get_bucket(bucketname)
keys = bucket.list(dirname)
for k in keys:
# options are 'private', 'public-read'
# 'public-read-write', 'authenticated-read'
k.set_acl('private')
此外,您可以考虑删除s3存储桶的权限选项卡下的任何存储桶策略 .
1
虽然@kintuparantu 's answer works great, it'值得一提,但由于 awk 部分,该脚本仅占 ls 结果的最后部分 . 如果文件名中包含空格, awk 将只获取由空格分隔的文件名的最后一段,而不是整个文件名 .
Example: 具有类似 folder1/subfolder1/this is my file.txt 的路径的文件将导致名为 file.txt 的条目 .
9 回答
根据我的理解,管理控制台中的“公共”选项以递归方式为目录中的每个对象添加公共授权 . 您可以通过右键单击一个文件,然后单击“属性”来查看 . 然后,您需要点击“权限”,并且应该有一行:
如果您在此目录中上传新文件,则它将不具有此公共访问集,因此是私有的 .
如果只有几个键或使用脚本,则需要手动删除公共读取权限 .
我使用'boto'模块在Python中编写了一个小脚本,以递归方式删除S3文件夹中所有键的'public read'属性:
我在一个包含(仅)2个对象的文件夹中对它进行了测试 . 如果您有 lots 个密钥,则可能需要一些时间才能完成,并且可能需要并行方法 .
接受的答案很有效 - 似乎也在给定的s3路径上递归设置ACL . 但是,这也可以通过名为s3cmd的第三方工具更轻松地完成 - 我们在公司中大量使用它,它似乎在AWS社区中相当受欢迎 .
例如,假设您有这种s3桶和目录结构:
s3://mybucket.com/topleveldir/scripts/bootstrap/tmp/
. 现在假设您已使用Amazon S3控制台将整个scripts
"directory"标记为公开 .现在再次将整个
scripts
"directory-tree"(即包括子目录及其文件)私有化:如果你想要的话,也可以很容易地再次公开
scripts
"directory-tree":您也可以选择仅在给定的s3 "directory"上设置权限/ ACL(即非递归),只需在上述命令中省略
--recursive
即可 .要使
s3cmd
正常工作,您首先必须通过s3cmd --configure
向s3cmd提供您的AWS访问和密钥(有关详细信息,请参阅http://s3tools.org/s3cmd) .对于AWS CLI,它非常简单 .
如果对象是:
s3://<bucket-name>/file.txt
对于单个对象:
对于桶中的所有对象(bash one-liner):
我实际上按照本指南http://aws.amazon.com/articles/5050/使用了亚马逊的用户界面
在AWS S3存储桶列表(AWS S3用户界面)中,您可以通过将整个文件夹内容公开来手动公开一个文件 or 来修改 individual 文件的权限(澄清一下,我指的是存储桶中的文件夹) . 要将公共属性恢复为私有,请单击该文件,然后转到权限并单击"EVERYONE" Headers 下的径向按钮 . 你得到第二个浮动窗口,你可以取消选中* read object " attribute. Don't forget to save the change. If you try to access the link, you should get the typical " Access Denied“消息 . 我附上了两个截图 . 第一个显示文件夹列表 . 单击文件并按照上述步骤显示第二个截图,显示了4个步骤 . 请注意,要修改多个文件,需要使用之前帖子中提出的脚本 . -Kf
截至目前,根据boto docs你可以这样做
此外,您可以考虑删除s3存储桶的权限选项卡下的任何存储桶策略 .
虽然@kintuparantu 's answer works great, it'值得一提,但由于
awk
部分,该脚本仅占ls
结果的最后部分 . 如果文件名中包含空格,awk
将只获取由空格分隔的文件名的最后一段,而不是整个文件名 .Example: 具有类似
folder1/subfolder1/this is my file.txt
的路径的文件将导致名为file.txt
的条目 .为了防止在使用他的脚本时,你必须用一系列变量占位符替换
awk {print $NF}
中的$NF
,这些占位符占'split by space'操作将导致的段数 . 由于文件名可能有相当大的数量在他们的名字中有空格,我更新了代码:我还要提一下,使用
cut
对我没有任何结果,所以我将其删除了 . 积分仍然留给@kintuparantu,因为他 Build 了脚本 .我今天这样做了 . 我的情况是我有一些顶级目录,其文件需要私有 . 我确实有一些需要的文件夹被公之于众 .
我决定像许多其他人已经展示过的那样使用
s3cmd
. 但是考虑到大量文件,我想为每个目录运行并行s3cmd
作业 . 由于它需要一天左右的时间,我想在EC2机器上将它们作为后台进程运行 .我使用
t2.xlarge
类型设置了一个Ubuntu机器 . 在s3cmd
失败后,我选择了xlarge,并在微实例上显示内存不足的消息 . xlarge可能有点过分,但这台服务器只能运行一天 .登录服务器后,我安装并配置了
s3cmd
:sudo apt-get install python-setuptools wget https://sourceforge.net/projects/s3tools/files/s3cmd/2.0.2/s3cmd-2.0.2.tar.gz/download mv download s3cmd.tar.gz tar xvfz s3cmd.tar.gz cd s3cmd-2.0.2/ python setup.py install sudo python setup.py install cd ~ s3cmd --configure
我最初尝试使用
screen
,但有一些问题,主要是进程从screen -r
下降,尽管运行正确的屏幕命令,如screen -S directory_1 -d -m s3cmd setacl --acl-private --recursive --verbose s3://my_bucket/directory_1
. 所以我做了一些搜索,找到了nohup
命令 . 这是我最终得到的:nohup s3cmd setacl --acl-private --recursive --verbose s3://my_bucket/directory_1 > directory_1.out & nohup s3cmd setacl --acl-private --recursive --verbose s3://my_bucket/directory_2 > directory_2.out & nohup s3cmd setacl --acl-private --recursive --verbose s3://my_bucket/directory_3 > directory_3.out &
使用多光标错误,这变得非常简单(我使用
aws s3 ls s3//my_bucket
列出目录) .这样做可以根据需要
logout
,然后重新登录并拖尾任何日志 . 你可以拖尾多个文件,如:tail -f directory_1.out -f directory_2.out -f directory_3.out
所以设置
s3cmd
然后使用nohup
,因为我演示了你很好 . 玩得开心!如果您有S3浏览器,您可以选择将其设为公开或私有 .