Не выполняйте Wireshark как корень. Очень/больше всего большого тела wireshark для кода не нужно к (и не должен), выполненный как корень. Существует по 1M строки кода!
Если пользователю нужно разрешить выполнить Wireshark, чтобы сделать сборы сетевых данных, только отдельная dumpcap программа (который делает фактические получения), нуждается в специальных полномочиях.
См.:
wiki.archlinux.org/index.php/Wireshark
wiki.wireshark.org/CaptureSetup/CapturePrivileges
wiki.wireshark.org/Security
(Также: простой поиск Google может помочь).
Нет стандартной команды для перечисления всех существующих учетных записей пользователей. В большинстве 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
для человеческих пользователей, другие значения для системных счетов.
Я думаю, что путь к домашнему каталогу - самый надежный единственный индикатор, но вы, возможно, захотите объединить его с другими эвристическими данными.
Основываясь на комментариях к вопросу и некоторых экспериментах, вот что я придумал ...
#!/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
может быть другой на разных ОС.
Я только что написал следующее, используя @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