获取不存在的系统用户信息,而不输出

问题描述:

这是我的代码,让所有系统用户:获取不存在的系统用户信息,而不输出

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#{用户}命令,该命令将返回不存在用户的输出气泡所有方式,完全像一个put或pp

我怎样才能使它静音,但仍评估命令的输出?

+1

扫描/ etc/passwd文件不是更容易吗? (如果OSX有这个文件) – Arsen7 2010-10-29 11:15:05

+0

是的,但是,OS X不会将系统用户存储在/ etc/passwd中。我看的第一个地方; )。谢谢! – Gerhard 2010-11-01 10:14:42

我宁愿一个更直接的方式:(编辑:更新了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 
+0

非常漂亮和优雅,就像你使用剪裁,应该把它放在我的腰带上。我也需要这个在OS X上工作,因为我甚至不会为从ENV开始编写用户主目录路径而烦恼[ '家']。 – Gerhard 2010-11-01 10:14:00

+0

@Gerhard我现在还没有访问OS X框,但似乎'dscacheutil -q user | grep name:| cut -d:-f2'会是一个简单而正确的方式来获取列表的用户。 – 2010-11-01 11:54:47

+0

这真是太棒了!低层次,跨平台 - 我很喜欢! – Gerhard 2010-11-07 13:32:05

您可以尝试重定向标准错误到标准输出(或开发/空),但它取决于你的shell:

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

..和你将需要检测时,实用程序返回的故障代码:

if $?.success? 
+0

是的,你已经钉了它!非常感激。 – Gerhard 2010-11-01 10:18:16

它更容易只是解析/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/下的主目录的用户。

+0

这看起来棒极了,如果我不想要OS X的支持,这简直太棒了! – Gerhard 2010-11-01 10:15:29