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