2

我想创建一个返回所有用户的因素。

Facter.add("sysusers") do
  setcode do
    File.readlines('/etc/passwd').each do |line|
      line.match(/^[^:]+/)[0]
    end
  end
end

然后在我的.pp文件中我有这个:

$users = inline_template("<%= scope.lookupvar('sysusers') %>")

$users.each |String $user| {
  notify { "$user":}
}

这应该可行,但因素一次只返回一个字母。

所以notify { "$user":}只打印:

Notify[r]
Notify[o]

然后它崩溃了,因为下一个字母也是“o”(“root”中有两个 o,root 是 /etc/passwd 中声明的第一个用户)。

那么如何打印所有用户呢?

编辑
与编辑:

Facter.add("sysusers") do
  setcode do
    File.readlines('/etc/passwd').each do |line|
      line.match(/^[^:]+/).to_s
    end
  end
end

然后输出是:

root@mymachine]# facter sysusers
[
  "root:x:0:0:root:/root:/bin/bash
",
  "bin:x:1:1:bin:/bin:/usr/bin/nologin
",
  "daemon:x:2:2:daemon:/:/usr/bin/nologin
...
...

所以它似乎仍然没有按预期工作。

4

3 回答 3

2

这就是你想要的比赛。

line.match(/^[^:]+/).to_s

当您添加 [0] 时,它会从字符串中获取第一个字符,即用户名。

编辑

File.readlines('/etc/passwd').collect do |line|
        line.match(/^[^:]+/).to_s
end

这将收集一个数组,该数组将在您的 setcode 中返回。

于 2015-07-30T19:08:28.260 回答
2

解析/etc/passwd是解决问题的笨拙方法。

使用Etc 模块更干净

require 'etc'
result = []
Etc.passwd { |user| result << user.name }
result
于 2015-07-31T11:04:20.917 回答
1

使用以下 ruby​​ 代码,该代码从 /etc/passwd 文件中读取并打印用户名。

IO.readlines("/etc/passwd").each do |val|
        user = val.split(":").first
        puts user
end
于 2015-10-20T10:43:03.370 回答