如何使用Shell脚本检查存储桶是否存在?

34
我已经安装了aws命令行工具,但不知道如何在shell脚本中使用它。
当我运行命令aws s3 ls s3://bucket时,会得到以下结果:

A client error (NoSuchBucket) occurred when calling the ListObjects operation: The specified bucket does not exist

这意味着指定的存储桶不存在。因此,我想从shell脚本中运行该命令,并通过grep查找是否存在。但我的命令无法正常工作。
if [ $(aws s3 ls "s3://$S3_BUCKET" | grep 'NoSuchBucket' &> /dev/null) == 0 ] 
then
    echo "$S3_BUCKET doesn\'t exist please check again"
    exit
fi

它只是给了我这个

备份.sh: 20: [: 0: 意外的操作符

更新

我将脚本更改为

echo "S3_BUCKET=$S3_BUCKET"
if aws s3 ls "s3://$S3_BUCKET" | grep -q 'AllAccessDisabled'    
then
    echo "$S3_BUCKET doesn\'t exist please check again"
    exit
fi

这是我得到的输出结果

A client error (AllAccessDisabled) occurred when calling the ListObjects operation: All access to this object has been disabled

文本中包含 AllAccessDisabled,但我仍然无法echo下一行。


这个回答解决了你的问题吗?AWS S3:如何使用bash检查存储桶中是否存在文件 - Amri
11个回答

51

1
不应该,因为在存储桶归另一个用户所有的情况下,它无法工作:http://pasted.co/7dae7402 - scubbo
1
这是否区分了一个不存在的存储桶和您无法访问的存储桶? - brianmearns
1
不,它不会成功。如果存储桶不存在或者存在但是被其他用户拥有,它都会失败...只是错误信息不同而已。你需要检查错误信息。 - Brooks

20

你列出的代码不会导致那个错误。

如果你在[$(之间没有留空格,那么就会发生错误。

此外,如果grep没有输出0,那么测试就不会按照你想要的方式进行。

如果你想测试grep是否找到了任何内容,则需要使用grep-q参数,像这样:

if aws s3 ls "s3://$S3_BUCKET" 2>&1 | grep -q 'NoSuchBucket'
then

1
那是错误输出。那可能是标准错误而不是标准输出。你需要进行重定向。请查看更新的代码。 - Etan Reisner

19
我知道这是一个老问题,但我来这里是为了找到一些答案,并使用一些现有的答案和我自己的一些实验,编写了一个处理不同返回值的脚本。
bucketstatus=$(aws s3api head-bucket --bucket "${s3_bucket}" 2>&1)
if echo "${bucketstatus}" | grep 'Not Found';
then
  echo "Bucket doesn't exist";
elif echo "${bucketstatus}" | grep 'Forbidden';
then
  echo "Bucket exists but not owned"
elif echo "${bucketstatus}" | grep 'Bad Request';
then
  echo "Bucket name specified is less than 3 or greater than 63 characters"
else
  echo "Bucket owned and exists";
fi

1
给易于理解并涵盖所有情况的答案点个赞。 - jcollum

5

以下是我是如何做到的,其他答案会说如果AWS出现错误但不包含“NoSuchBucket”(例如令牌到期)则会有一个存储桶

echo "Checking S3 bucket exists..."                                                                                                                                                                                                           
BUCKET_EXISTS=true                                                                                                                                                                                                                            
S3_CHECK=$(aws s3 ls "s3://${BUCKET_NAME}" 2>&1)                                                                                                                                                 

#Some sort of error happened with s3 check                                                                                                                                                                                                    
if [ $? != 0 ]                                                                                                                                                                                                                                
then                                                                                                                                                                                                                                          
  NO_BUCKET_CHECK=$(echo $S3_CHECK | grep -c 'NoSuchBucket')                                                                                                                                                                                     
  if [ $NO_BUCKET_CHECK = 1 ]; then                                                                                                                                                                                                              
    echo "Bucket does not exist"                                                                                                                                                                                                              
    BUCKET_EXISTS=false                                                                                                                                                                                                                       
  else                                                                                                                                                                                                                                        
    echo "Error checking S3 Bucket"                                                                                                                                                                                                           
    echo "$S3_CHECK"                                                                                                                                                                                                                          
    exit 1                                                                                                                                                                                                                                    
  fi 
else                                                                                                                                                                                                                                         
  echo "Bucket exists"
fi                                                                                                                                                                                                                                            

5

4

不需要处理错误:

if [[ ! -z $(aws s3api list-buckets --query 'Buckets[?Name==`bucket-name`]' --output text) ]]; then
  echo "Bucket Exists"
fi

非常优雅。最佳答案。 - Bobby Koteski

3

我偶然看到这个问题,想要添加使用 AWS 推荐的方法来解决问题,使用 head-bucket

BUCKET_EXISTS=$(aws s3api head-bucket --bucket <bucket_name> 2>&1 || true)
if [ -z "$BUCKET_EXISTS" ]; then
  echo "Bucket exists"
else
  echo "Bucket does not exist"
fi

2
#!/bin/bash

if [[ -z $(aws s3api head-bucket --bucket my-bucket 2>&1) ]]; then
        echo "bucket exists"
else
        echo "bucket does not exist or permission is not there to view it."
fi

你可能弄反了,[[ ! -z ... ]] 的意思是如果它不是空的。 - Christian
@Christian 不,如果存储桶存在,则输出将为空,否则它将在标准输出上抛出一个错误。希望这可以帮到你。 - Yogesh Gupta

0

这可能是最简单的方法

if aws s3 ls "s3://$S3_BUCKET" 2>&1 | grep -q 'An error occurred'
then
    echo "bucket does not exist or permission error."
else
    echo "bucket exist"
fi

0
一个很好的一行代码,基于约翰·弥尔顿的答案构建:
bucket_exists=$(aws s3api head-bucket --bucket $bucket_name 2>/dev/null && echo "yes" || echo "no")

如果 AWS 命令返回 0 状态并运行三元表达式的第一部分,则表示响应成功。

如果 AWS 命令返回 254 状态并运行三元表达式的后半部分,则表示响应失败。

在我看来,这种写法更易读,但每个人都有自己的喜好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接