如何使用shell脚本检查存在桶?

时间:2015-06-26 16:02:18

标签: bash shell ubuntu amazon-s3

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

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

  

调用ListObjects操作时发生客户端错误(NoSuchBucket):指定的存储桶不存在

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

9 个答案:

答案 0 :(得分:23)

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

答案 1 :(得分:10)

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

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

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

如果您想测试grep是否找到了任何内容,那么您想要-q grep这样的参数:

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

答案 2 :(得分:2)

以下是我的方法,另一个答案是,如果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                                                                                                                                                                                                                                            

答案 3 :(得分:1)

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

答案 4 :(得分:1)

没有必要处理错误:

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

答案 5 :(得分:0)

这可能是我最简单的方法

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

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

#!/bin/bash

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

答案 8 :(得分:0)

我偶然发现了这个问题,并想通过head-bucket使用AWS推荐的方式添加解决方案。

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