【问题标题】:How do I use shell script to check if a bucket exists?如何使用 shell 脚本检查存储桶是否存在?
【发布时间】:2015-09-13 16:02:12
【问题描述】:

我安装了aws cli。我只是不确定如何在 shell 脚本中执行此操作。

当我运行命令 aws s3 ls s3://bucket 时,它会给我类似的东西

调用ListObjects操作时出现客户端错误(NoSuchBucket):指定的bucket不存在

这意味着存储桶不存在。所以我想从 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

它只是给了我这个

backup.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下一行。

【问题讨论】:

标签: bash shell ubuntu amazon-s3


【解决方案1】:

s3api head-bucket 更直接,不会产生列出包含许多文件的存储桶的费用。

http://docs.aws.amazon.com/cli/latest/reference/s3api/head-bucket.html

if aws s3api head-bucket --bucket "$S3_BUCKET" 2>/dev/null; then

【讨论】:

  • 不,它不应该,因为它在存储桶由另一个用户拥有的情况下不起作用:pasted.co/7dae7402
  • 这会区分不存在的存储桶和您无权访问的存储桶吗?
  • 不,它没有。如果存储桶不存在以及它存在但由另一个用户拥有,它将失败......只是带有不同的错误消息。您需要检查错误消息。
【解决方案2】:

您列出的代码不会给您该错误。

如果您编写的脚本没有前导 [$( 之间的空格,那将有。

在这种情况下,grep 也不会输出 0,因此测试不会按照您想要的方式工作。

如果你想测试grep 是否找到任何东西,那么你想像这样使用-q 参数到grep

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

【讨论】:

  • 这是错误输出。这可能会导致标准错误而不是标准输出。您需要为此重定向。查看更新的代码。
【解决方案3】:

我知道这是一个老问题,但我来这里是为了得到一些答案,并使用一些现有的答案和我自己的一些实验提出了一个处理不同返回值的脚本:

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

【讨论】:

  • 赞成一个涵盖所有案例的易于理解的答案
【解决方案4】:

我是这样做的,如果出现不包含“NoSuchBucket”的 AWS 错误(例如令牌过期),另一个答案会说有一个存储桶

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】:

    aws推荐的方式是aws s3api head-bucket --bucket $S3_BUCKEThttps://docs.aws.amazon.com/cli/latest/reference/s3api/head-bucket.html

    【讨论】:

      【解决方案6】:

      我偶然发现了这个问题,并想使用 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
      

      【讨论】:

        【解决方案7】:

        无需处理错误:

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

        【讨论】:

        • 非常优雅。最佳答案。
        【解决方案8】:
        #!/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 不,如果存储桶存在,输出将为空,否则它将在标准输出上吐出错误。希望对您有所帮助。
        【解决方案9】:

        这可能是我最简单的方法

        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
        

        【讨论】:

          猜你喜欢
          • 2015-07-27
          • 2020-06-30
          • 2013-09-06
          • 2020-11-27
          • 2021-06-01
          • 2020-11-06
          • 1970-01-01
          • 1970-01-01
          • 2023-03-14
          相关资源
          最近更新 更多