3

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

1 回答 1

3

您正在检查文件名是否为 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
于 2016-11-07T17:16:42.717 回答