使用InSpec检查文件的内容(如果存在)

时间:2016-11-07 17:13:36

标签: ruby serverspec inspec

我正在ruby中编写一个Chef InSpec测试来检查'umask 077'文件的内容。问题是我正在检查的数组中的一些文件不存在。我正在尝试排除nil文件并重新推送它们,但它似乎试图检查所有文件。有什么想法吗?

这是我的代码:

control 'auth-default-umask' do
  impact 0.5
  title 'Default umask'
  desc 'DISA RHEL6 STIG (V1R2)'

  %w(/etc/profile /etc/bashrc /etc/csh.login /etc/.login).each do |umask_file|
    filecheck = []
    unless umask_file == nil
      filecheck.push(umask_file)
      describe directory(filecheck) do
        its('content') { should match /umask 077/ }
      end
    end
  end
end

1 个答案:

答案 0 :(得分:1)

你正在检查文件名是否为nil,它从来都不是,所以自然它会运行所有这些时间。如果文件不存在,您是否尝试排除该文件?

另外,您可能想要描述目录而不是目录列表,所以请注意我也改变了。

这是最终结果:

control 'auth-default-umask' do
  impact 0.5
  title 'Default umask'
  desc 'DISA RHEL6 STIG (V1R2)'

  %w(/etc/profile /etc/bashrc /etc/csh.login /etc/.login).each do |umask_file|
    filecheck = []
    if File.exists?(umask_file)  # check file existence
      filecheck.push(umask_file)
      describe directory(umask_file) do  # describe this directory
        its('content') { should match /umask 077/ }
      end
    end
  end
end

你正确使用%w()创建一个文件名数组,它只是将每个单词放在其中并创建一个字符串数组(您输入的路径)。仅这些没有任何意义,但它们可以与类(例如File)一起使用,以在文件系统上下文中变得有意义。

例如,

File.exists?(filename)检查文件是否存在。

要阅读文件,您可以使用File.open

File.open(filename, 'r') do |file|
  until file.eof?
    line = file.gets
    # do something with line
  end
end