我想使用shell脚本输出来验证处于保护状态的资源。我使用下面的代码仍然不起作用。
bash "stampDisksuccess" do
code <<-EOH
whoami
EOH
user 'root'
not_if {"`sudo sh /home/scripts/getStampedDisk.sh test`" == ''}
end
无论脚本(getStampedDisk.sh)返回的是空白消息还是一些数据,bash资源都将被执行。当脚本返回空白数据时,我期望它不应该运行。
如果有什么遗漏,请纠正我。
让我们剖析一下:
not_if {"`sudo sh /home/scripts/getStampedDisk.sh test`" == ''}
- 没有if。。。很明显,是警卫
{
分块"
字符串打开- 回溯打开
- 命令
- 结束倒钩和报价
==
操作员''
常量空字符串}
合闸块
这是一个测试空字符串的大量操作。backticks的输出不能保证真的是空的(例如,它可以有一个换行符),然后将其与任意的空字符串(不是nil,它是一个什么都没有的字符串)进行比较。它有很多方法会变得糟糕,并且很难调试非打印字符。
然而,shell已经有了一个运算符,它是用于普通bash的-z
。
引用bash文档:
-z string True if the length of string is zero.
另一个助手是$()
,用于评估脚本中的命令
最后一个是[[ ]]
构造,告诉我们使用的是运算符而不是命令。
总之,当用字符串表示时,您最终会得到命令执行保护(此处为有关保护的文档)
not_if '[[ -z $(sudo sh /home/scripts/getStampedDisk.sh test) ]]'
来自卫士文档的报价:
保护属性接受字符串值或Ruby块值:
- 字符串作为shell命令执行。如果命令返回0应用防护。如果该命令返回任何其他值,则未应用guard属性
- 一个块作为Ruby代码执行必须返回true或false。如果block返回true,则guard属性。如果块返回false,则guard属性未应用
如果你在保护中不使用ruby,不使用块,你只是在添加层,这会给你带来麻烦,特别是当你试图比较不可打印或空字符串,并且很难调试时,如果你需要调用命令或脚本,试着使用标准的shell命令,你可以在控制台中测试它,并确保以后不会出现问题。