我正在尝试使用创建的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
}
答案 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
和应该回显的文本之间的换行符,或使用\
对其进行换行,这应该可以工作。