Получить несуществующую информацию о пользователе системы без вывода - PullRequest
0 голосов
/ 29 октября 2010

Это мой код для получения всех пользователей системы:

 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} возвращает выходные данные для несуществующих пользователей, которые всплывают на всем протяженииТочно так же, как пут или стр.

Как я могу отключить звук, но все же оценить вывод команды?

Ответы [ 3 ]

1 голос
/ 29 октября 2010

Я бы предпочел более прямой способ: (РЕДАКТИРОВАТЬ: я думаю, что он обновлен для работы с 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 голосов
/ 29 октября 2010

Проще всего разобрать файл /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 голосов
/ 29 октября 2010

Вы можете попытаться перенаправить stderr на стандартный вывод (или dev / null), но это зависит от вашей оболочки:

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

.. и вам нужно будет определить, когда утилита вернула код ошибки:

if $?.success?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...