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":}
}

これは機能するはずですが、ファクトは一度に 1 文字しか返しません。

したがってnotify { "$user":}、印刷するだけです:

Notify[r]
Notify[o]

そして、次の文字も「o」であるため、クラッシュします (「root」に 2 つの 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

これにより、セットコードで返される配列が収集されます。

于 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 に答える