ruby 更改每个文件目录的所有者和组

juzqafwq  于 12个月前  发布在  Ruby
关注(0)|答案(2)|浏览(138)

我正在尝试更改目录中每个文件的所有者,组和权限:

%w(/etc/nginx/ /etc/nginx/conf.d/ /var/l0g/nginx/).each do |path|
  directory path do
    owner "owner1"
    group "group1"
    mode '0755'
  end
end

字符串
但是它只改变了%w()中指定的目录的值,我希望这是递归的,特别是directory关键字。
我怎么能让这个脚本更改所有者,组和权限的所有文件在指定的目录,包括目录本身?
多谢帮忙!

kcwpcxri

kcwpcxri1#

directory资源有一个recursive属性,记录如下:
recursive

Ruby类型truefalse|默认值:false

递归创建父目录,或递归删除目录和所有子目录。对于所有者、组和模式属性,此属性的值仅适用于叶目录。
因此,没有内置的方法来递归地设置目录中所有文件的权限。这也不是一个好主意,因为您的mode755将所有配置文件标记为可执行文件。由于nginx配置文件通常不是可执行的,这可能会做错误的事情!
不过,如果您确实想这样做,您可以在ruby_block资源中编写一点Ruby,例如

require 'fileutils'

%w(/etc/nginx/ /etc/nginx/conf.d/ /var/l0g/nginx/).each do |path|
  ruby_block "Set recursive permissions for #{path}" do
    block do
      FileUtils.chmod_R(0755, path)
      FileUtils.chown_R("owner1", "group1", path)
    end
  end
end

字符串
一个稍微“正确”的版本是:

%w(/etc/nginx/ /etc/nginx/conf.d/ /var/l0g/nginx/).each do |path|
  ruby_block "Set recursive permissions for #{path}" do
    block do
      FileUtils.chmod_R("u=rw+X,go=r+X", path)
      FileUtils.chown_R("owner1", "group1", path)
    end
  end
end


在这里,我们使用符号模式描述而不是严格的数字模式描述。这允许我们使用X规范而不仅仅是x。chmod规范如下:

  • 对于u服务器(即所有者),设置r ead和w rite位。如果文件是一个目录或当前设置了e x ecute位,则设置执行位。
  • 对于g组和o组,只设置r ead位。如果文件是一个目录或当前设置了ex 1 m18n1x ecute位,则设置执行位。

这样,所有目录都将设置执行/搜索位,只有那些以前设置了执行位的文件将保留它(但没有新文件填充获得执行位)。
作为一些最后的说明:

  • 由于/etc/nginx/conf.d已经包含在/etc/nginx中,因此可以从列表中省略它。
  • 您可能指的不是/var/l0g/nginx/(路径中带有“零”字符),而是/var/log/nginx/(带有一个小o)。
2o7dmzc5

2o7dmzc52#

来自 @Holger Just 的答案已经涵盖了更改权限/所有权的含义。除此之外,Chef是一个 configuration as code 工具,在管理已定义资源的状态方面非常有效。因此,使用它来更改资源,例如文件/目录,而不是直接由它管理,不能保证幂等操作。
考虑到所有这些,一种选择是使用scriptexecute资源运行相关的Linux命令。
使用execute资源的示例:

execute 'change nginx paths ownership' do
  command 'chown --recursive owner1:group1 /etc/nginx/ /var/log/nginx/'
end

execute 'change nginx paths permissions' do
  command 'chmod --recursive 0755 /etc/nginx/ /var/log/nginx/'
end

字符串

相关问题