Как циклично выполниться по пользователям?

Не выполняйте Wireshark как корень. Очень/больше всего большого тела wireshark для кода не нужно к (и не должен), выполненный как корень. Существует по 1M строки кода!

Если пользователю нужно разрешить выполнить Wireshark, чтобы сделать сборы сетевых данных, только отдельная dumpcap программа (который делает фактические получения), нуждается в специальных полномочиях.

См.:

wiki.archlinux.org/index.php/Wireshark

wiki.wireshark.org/CaptureSetup/CapturePrivileges

wiki.wireshark.org/Security

(Также: простой поиск Google может помочь).

4
18.05.2015, 21:45
3 ответа

Нет стандартной команды для перечисления всех существующих учетных записей пользователей. В большинстве Unix-вариантов /etc/passwd содержит список локальных учетных записей, всегда с одним и тем же традиционным форматом (колонки, разделенные колонками). В Linux с Glibc (т.е. в любом не встраиваемом Linux) можно использовать команду getent : getent passwd аналогична cat /etc/passwd, но также включает в себя удаленные учетные записи (NIS, LDAP, ...).

Следующий фрагмент перечисляет учетные записи пользователей:

getent passwd | while IFS=: read -r name password uid gid gecos home shell; do
  echo "$name's home directory is $home"
done

Фильтрация пользователей из плоти и крови полностью надежным способом невозможна, так как ничто в базе данных пользователей не говорит о том, является ли пользователь плотью и кровью. (Плюс: учитываются ли тестовые учетные записи? Считаются ли гостевые учетные записи? и т.д.) Вот некоторые эвристики, которые вы можете применить.

  • Вы можете фильтровать пользователей, чей домашний каталог, кажется, не является системным.

    top=${home#/}; top=${top%%/*}
    корпус $top in
     |bin|dev|etc|lib*|no*|proc|sbin|usr|var) эхо "Похоже на пользователя системы";;
     *) echo "Похож на пользователя с настоящим домашним каталогом";;
    esac
    
  • Вы можете проверить, владеет ли пользователь их домашним каталогом. Почти всегда так бывает с пользователями из плоти и крови, и обычно не бывает с системными пользователями, но это не очень надежно, потому что некоторые пользователи системы владеют своим домашним каталогом. Более того, домашний каталог пользователей плоти и крови может не существовать, если это удаленный каталог, который в настоящее время недоступен, хотя обычно каталог будет автоматически монтироваться. На Linux:

     если [ -d "$home" ] && [ "$(stat -c %u "$home")" = "$uid" ]; то
     эхо "Вероятная плоть и кровь"
    другое 
     эхо "Возможно, пользователь системы"
    
    
  • Вы можете проверить, есть ли у пользователя оболочка, которая является настоящей оболочкой. Но многие пользователи системы также делают это, так что это еще менее надежно, чем домашний каталог.

  • Вы можете проверить, есть ли у учетной записи пароль. Это не совсем надежно, потому что пользователи плоти и крови не всегда имеют пароль (например, у них могут быть только SSH ключи). Иногда системные учетные записи имеют пароль - в частности, учетная запись root часто его имеет. Как это сделать, зависит от Unix-варианта и часто требует root-доступ. В Linux с теневыми паролями (что является нормальным явлением для Linux), вам нужно посмотреть на пароль в /etc/shadow.

    case $(getent shadow "$name" | awk -F: '{print $2}') in
     ?|??) echo "No password on this account";..;
     |\$*) эхо "У этой учетной записи есть пароль";;
     *) эхо "Странное поле пароля";;
    esac
    
  • Многие системы определяют диапазоны UID для системных счетов против пользователей из плоти и крови. Диапазоны зависят от системы: по умолчанию они зависят от Unix-варианта и дистрибутива, и обычно могут быть сконфигурированы системным администратором. На большинстве дистрибутивов Linux эти диапазоны определены в login.defs: UID_MIN до UID_MAX для человеческих пользователей, другие значения для системных счетов.

Я думаю, что путь к домашнему каталогу - самый надежный единственный индикатор, но вы, возможно, захотите объединить его с другими эвристическими данными.

5
27.01.2020, 20:49

Основываясь на комментариях к вопросу и некоторых экспериментах, вот что я придумал ...

#!/bin/bash
#Use awk to do the heavy lifting.
#For lines with UID>=1000 (field 3) grab the home directory (field 6)
usrInfo=$(awk -F: '{if ($3 >= 1000) print $6}' < /etc/passwd)

IFS=$'\n' #Use newline as delimiter for for-loop
for usrLine in $usrInfo
do
  #Do processing on each line
  echo $usrLine
done

или как предложено в комментариях Phetent Passwd может быть Используется для случаев, когда / etc / passwd не имеет полного списка. Слава к Братчели за этот драгоценный камень. :)

usrInfo=$(getent passwd | awk -F: '{if ($3 >= 1000) print $6}')

Обратите внимание, что чек > = 1000 может быть другой на разных ОС.

2
27.01.2020, 20:49

Я только что написал следующее, используя @gilles awesome answer в качестве шаблона. У меня хорошо работает. Проверено на Ubuntu 16.04 с использованием zsh.

# get all users
getent passwd | while IFS=: read -r name password uid gid gecos home shell; do
    # only users that own their home directory
    if [ -d "$home" ] && [ "$(stat -c %u "$home")" = "$uid" ]; then
        # only users that have a shell, and a shell is not equal to /bin/false or /usr/sbin/nologin
        if [ ! -z "$shell" ] && [ "$shell" != "/bin/false" ] && [ "$shell" != "/usr/sbin/nologin" ]; then
            echo "$name's home directory is $home using shell $shell"
        fi
    fi
done
1
27.01.2020, 20:49

Теги

Похожие вопросы