Ruby循环获取Linux机器上所有主目录中的所有文件(Inspec / Chef工作)

时间:2016-09-19 14:49:33

标签: ruby rspec chef inspec

我尝试使用Linux命令检查Linux机器上每个主目录中每个文件的文件所有权,作为使用ruby编写的Inspec测试。我有一个名为ownerArray的主目录所有者数组(包含bin,root,daemon等用户),我试图使用Dir.glob类来获取每个所有者的每个目录中的每个文件在我的数组中,但是当我运行我的代码时,它只通过bin循环。我想通过/ etc / passwd大约有15个所有者循环,但是下面只检查bin(我可以告诉我何时打印每个文件的名称)。这是一个权限问题,还是我有不同的方式我应该使用Dir.glob来获取我的机器上每个主目录的所有者的每个文件。感谢您的时间和帮助。

ownerArray = %w()

  command("cut -d : -f1 /etc/passwd").stdout.each_line do |line|
    if (command("echo ~#{line}").stdout != "/\n")
      user = "/" + line.chomp()
      ownerArray.push user
    end
  end

ownerArray.each do |owner|
  Dir.glob("#{owner}/**/*", File::FNM_DOTMATCH).each do |file| 
    next if File.basename(file) == '.' || File.basename(file) == '..'
    group = command("stat -c %G #{file}").stdout
    describe command("id -Gn #{owner} | grep -c '\b{group}\b'") do
      its ('stdout') {should_not match "0\n"}
    end
  end
end

请参阅上面添加的ownerArray。它只是从/ etc / passwd抓取用户。对于输出,我希望每次在主目录中存在文件时测试失败,拥有这些文件的组不是主目录所有者所属的组。如果主目录所有者不是拥有用户主目录中给定文件的组的成员,则grep返回0。

1 个答案:

答案 0 :(得分:1)

你拥有的循环没问题,但用file InSpec resource替换你的command内容。应该简化一下。您还可以使用它来检查其他文件参数,例如组和模式。