在bash中创建json文件时文件名过长错误

时间:2019-01-25 17:57:38

标签: json bash

我正在尝试使用创建的bash脚本创建json文件。该脚本创建文件,但是该文件为空。

运行时,出现以下错误:File name too long

该文件没有内容,它是完全空的:

-rw-r--r-- 1 tdunphy tdunphy 0 Jan 25 09:45 pol-aws-secrets-manager-aws-test-user-one.json

我怀疑文件名不是问题。我认为该文件的内容可能太长。使用bash可以回声到文本文件的数量有限制吗?

这是我的剧本:

#!/bin/bash
aws_user_name=tim
aws_kms_key_arn=arn
create_secrets_manager_policy() {

output_dir="../json/iam"
ofile="$output_dir"/pol-aws-secrets-manager-"$aws_user_name".json

#### BEGIN JSON
 echo
  "{
    \"Version\": \"2012-10-17\",
    \"Statement\": [{
        \"Effect\": \"Allow\",
        \"Action\": [
          \"secretsmanager:ListSecrets\",
          \"secretsmanager:GetRandomPassword\"
        ],
        \"Resource\": \"*\"
      },
      {
        \"Effect\": \"Allow\",
        \"Action\": [
          \"kms:Decrypt\"
        ],
        \"Resource\": \"$aws_kms_key_arn\"
      },
      {
        \"Effect\": \"Allow\",
        \"Action\": [
          \"kms:List*\"
        ],
        \"Resource\": \"*\"
      },
      {
        \"Effect\": \"Allow\",
        \"Action\": [
          \"secretsmanager:GetResourcePolicy\",
          \"secretsmanager:GetSecretValue\",
          \"secretsmanager:DescribeSecret\",
          \"secretsmanager:ListSecretVersionIds\"
        ],
        \"Resource\": \"*\",
        \"Condition\": {
          \"ForAnyValue:StringEquals\": {
            \"secretsmanager:ResourceTag/Name\": \"$aws_user_name\"
          }
        }
      }
    ]
  }"  > "$ofile"

  ######## END JSON     

}

2 个答案:

答案 0 :(得分:2)

您似乎要回显的字符串从echo命令的另一行开始。这意味着它将不回显任何内容,然后尝试将字符串本身作为命令运行-并且由于它太长而无法成为命令,因此会出现“文件名太长”错误。 (如果错误消息看起来很奇怪,请注意命令实际上文件名。)

直接解决方案:要么在与echo相同的行上开始字符串,要么在echo的行末添加转义符(反斜杠)以在下一行继续。

替代解决方案:实际上,我会使用一个here-document,而不是使用带有长字符串的echo。最大的区别是您不需要以这种方式对字符串中的双引号进行转义。您需要转义所有不希望被解释为变量替换的“ $”字符,以及所有应为原义的反斜杠字符……但我在您的字符串中均未看到任何一个。所以看起来像这样:

cat >"$ofile" <EOF
{
    "Version": "2012-10-17",
    "Statement": [{
        "Effect": "Allow",
        "Action": [
...
           "secretsmanager:ResourceTag/Name": "$aws_user_name"
         }
       }
     }
   ]
}
EOF

其他替代解决方案:使用jq之类的工具来正确处理json语法,构造json确实更好。在这种情况下,IMO可以跳过该操作,因为要插入的字符串不应包含任何需要特殊处理的内容。但这是一个快捷方式,并非真正的正确方法。

答案 1 :(得分:1)

您的echo是其行上的第一个也是唯一的令牌,因此它被解析为命令,该命令具有关联的内置函数,无需参数即可执行。没有任何参数,echo只会输出换行符。

然后,下一行包含跨越多行的字符串,这是这些行的第一个标记。再次将其解析为命令;它没有关联的内置函数,因此在$PATH中作为可执行文件进行搜索,这可能是此处失败的原因。

删除echo和应该回显的文本之间的换行符,或使用\对其进行换行,这应该可以工作。