没有输出就获得不存在的系统用户信息

时间:2010-10-29 09:38:38

标签: ruby linux macos

这是我获取所有系统用户的代码:

 def get_all_system_users
  user_paths = Dir["#{ENV['HOME']}/../*"]
  users = user_paths.map { |path| path.split("..")[-1].gsub(/\W/, '') }
  users.select { |user| %x{id #{user}}.include?("uid") }
end

问题是 id#{user} 命令,该命令返回一直存在气泡的不存在用户的输出,与puts或pp完全相同。

如何将其静音但仍评估命令的输出?

3 个答案:

答案 0 :(得分:1)

我更喜欢更直接的方式:(编辑:我认为已更新为与OSX合作)

def get_all_system_users
  `dscacheutil -q user|grep name:|cut -d: -f2`.split
end

或者,处理多个操作系统:

require 'rbconfig'

def get_all_system_users
  case RbConfig::CONFIG['host_os']
    when /mac|darwin/i
      `dscacheutil -q user|grep name:|cut -d: -f2`.split
    when /linux/i
      `cat /etc/passwd|grep "/home"|cut -d: -f1`.split
    else
      raise "InferiorOS Error" #or whatever
  end
end

答案 1 :(得分:0)

您可以尝试将stderr重定向到stdout(或dev / null),但这取决于您的shell:

%x{id #{user} 2>&1}

..您将需要检测实用程序何时返回失败代码:

if $?.success?

答案 2 :(得分:0)

解析/etc/passwd文件更容易:

Hash[File.readlines('/etc/passwd').map { |line|
       line.split ':'
     }.select { |field|
       field[5].index('/home/') == 0 && File.directory?(field[5])
     }.map { |field|
       [field[0], field[2].to_i]
     }]

这将返回一个哈希,用户名作为键, uid 作为值 具有/home/下的现有主目录的所有用户。