1

坚持这一点,这个布局是为厨师检查测试但利用 ruby​​ 来获取文件的内容。但是,通过这个测试,我实际上并没有针对文件进行测试,所以我试图了解如何解释这一点,代码如下:

%w(/etc/bashrc /etc/profile).each do |path|
file(path).content.scan(/^\s*umask\s+(\d{3})\b/).flatten.each do |umask| 
 BASELINE = '0027'
 (1..3).each do |i| # leading char is '0' octal indicator
    describe umask[i].to_i do
        it { should be <= BASELINE[i].to_i }
     end
    end
   end
  end
end

这是给我带来麻烦的线路

file(path).content.scan(/^\s*umask\s+(\d{3})\b/).flatten.each do |umask|
4

2 回答 2

0

您可以更改file(path).content为与文件内容匹配的字符串。

"Sample_string".scan(/^\s*umask\s+(\d{3})\b/).flatten.each do |umask|

如果您没有针对真实文件进行测试,原因是file(path).content返回。nil并且nil没有该scan方法,这就是您收到错误的原因。

于 2016-08-17T15:51:29.747 回答
0

就错误而言,即“ Undefined method 'scan' for nil:NilClass ”,只有在执行 inspec 运行时,如果正在传递的文件不存在或不可读,则只会出现此错误在文件系统上。

此外,提供的信息不完整,因为不清楚两个文件中设置的 umask 是什么,即是 3 位数字还是 4 位数字?

因为在进行扫描时,您正在寻找 3 位 umask “ scan(/^\s umask\s+(\d{3})\b/)* ”,并且您已设置“ BASELINE = '0027' ”,即 4 位. 所以,肯定会有问题。

如果文件中有“ umask 027 ”,则应该是:检查BASELINE = '027',搜索 3 digit umask

%w(/etc/bashrc /etc/profile).each do |path|
  file(path).content.scan(/^\s*umask\s+(\d{3})\b/).flatten.each do |umask| 
   BASELINE = '027'
   (1..3).each do |i| # leading char is '0' octal indicator
      describe umask[i].to_i do
        it { should be <= BASELINE[i].to_i }
      end
   end
 end
end

否则文件中有“ umask 0027 ”,那么,它应该是:

检查scan(/^\s*umask\s+(\d{4})\b/),搜索4位umask

%w(/etc/bashrc /etc/profile).each do |path|
  file(path).content.scan(/^\s*umask\s+(\d{4})\b/).flatten.each do |umask| 
   BASELINE = '027'
   (1..3).each do |i| # leading char is '0' octal indicator
      describe umask[i].to_i do
        it { should be <= BASELINE[i].to_i }
      end
   end
 end
end
于 2016-08-19T06:13:41.773 回答