Ruby 在没有输出的情况下获取不存在的系统用户信息

Ruby 在没有输出的情况下获取不存在的系统用户信息,ruby,linux,macos,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}命令,该命令为不存在的用户返回一个始终

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

 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一样


如何使其静音但仍然计算命令的输出?

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

%x{id #{user} 2>&1}
..您需要检测实用程序何时返回故障代码:

if $?.success?

我更喜欢一种更直接的方式:(编辑:我想是为了使用OSX而更新的)

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

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

只解析
/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/

下具有现有主目录的所有用户是否更容易扫描/etc/passwd文件?(如果OSX有此文件)是的,但OSX不将系统用户存储在/etc/passwd中。我看的第一个地方;)。谢谢非常漂亮和优雅,就像你使用的cut一样,应该在我的腰带下。我也需要这个来在OS X上工作,因为我甚至不会费心从ENV['home']开始计算用户的home dir路径。@Gerhard我现在没有访问OS X盒的权限,但是似乎
dscacheutil-quser | grep name:| cut-d:-f2
将是一种获取用户列表的简单而正确的方法。这真是太棒了!低水平,跨平台-我喜欢!这看起来棒极了,如果我不想要OSX支持,这简直太棒了!是的,你成功了!非常感谢。
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]
     }]