使用 InSpec 检查文件内容是否存在

Check content of file with InSpec if it exists

我正在 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

您正在检查文件名是否为 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

if File.exists?(umask_file) 方法适用于本地系统。如果 Inspec 与 --target 选项一起使用,此方法可能无法按预期工作,因为在本地执行存在性检查后,follow-up 检查将针对目标 运行。

在目标端测试文件是否存在的替代语法是:

control 'example-control-name' do
  only_if { file('/path/to/file').exist? }
  describe file('/path/to/file') do
    its('content') { should match /desired-content-here/ }
  end
end