если оператор запрашивает идентификатор пользователя в etc / passwd?


8

Используя bash, я пытаюсь сделать запрос /etc/passwdдля любых пользователей с идентификатором более 1000. Если они существуют, то делайте что-то другое. Я в тупике. Любая помощь приветствуется.

if [ "$(id -u)" -gt "1000" </etc/passwd]; then
    do something
else
    do something else
fi

1
Это должно быть в bash (shell)?
— Стивен Раух

Да, прости. используя bash
— user3239222

Ответы:


8

Попробуй это:

if grep -E '^[^:]*:[^:]*:[^:]{4}' /etc/passwd | grep -Evq '^[^:]*:[^:]*:1000:'

Первый grepищет passwdстроки с идентификатором из четырех или более цифр. Второй grepотфильтровывает строку с uid 1000. Статус выхода будет 0, если какие-либо строки останутся, 1, если нет.


я получаю синтаксическую ошибку: неожиданный конец файла
— user3239222

Вы должны следовать за ним с помощью thenстроки и т. Д.
— Том

1
Я забыл; сделать второй grep, -Evqчтобы подавить его вывод.
— Том

4
На первый взгляд, это ищет поля UID длиной не менее 4 символов, что работает здесь, но не очень полезно, если значение отсечения не равно десяти. Кроме того, результаты могут сбивать с толку, если некоторые числа по каким-либо причинам получают начальные нули.
— ilkkachu

1
Если вы используете YP / NIS или LDAP, то анализируйте вывод getent passwdвместо /etc/passwdфайла.
— Кусалананда

16

Чтобы сделать это в bashцикле, я предлагаю использовать readи IFSнравится:

#!/usr/bin/env bash
while IFS=':' read -r user passwd uid gid comment home shell;  do
    if [ "$uid" -gt 1000 ] ; then
        echo GT $user
    else
        echo LT $user
    fi
done < /etc/passwd

пробовал, но выводит всех пользователей LT и GT
— user3239222

1
Он выводит некоторые пользователи , как LT, а остальные как GT. Что я и думал, что тебе нужно.
— Стивен Раух

я только хочу проверить etc / password, чтобы увидеть, существуют ли какие-либо UID больше 1000 и сделать что-то, если true, сделать что-то еще, если false ..
— user3239222

4
Ключевыми словами в вашем комментарии являются, если таковые имеются , вопрос, заданный для и они . Во множественном числе они указали мне, что вы намеревались обрабатывать каждого пользователя. Но три других ответа здесь не прочитали это таким образом, так что ...
— Стивен Раух

14

Вместо того, чтобы читать /etc/passwdнапрямую, вы должны использовать getent passwd, это также будет работать, если некоторые из ваших пользователей сохранены в чем-то вроде LDAP или что-то подобное. awkдолжен хорошо подходить для формата вывода, разделенного двоеточиями.

Это напечатало бы имена пользователей всех пользователей с UID> 1000:

getent passwd | awk -F: '$3 > 1000 {print $1}'

И это было бы просто напечатать, foundесли хотя бы один такой найден:

getent passwd | awk -F: '$3 > 1000 {print "found"; exit}'

как бы я использовал это с оператором if хотя? если $ 3> 1000, сделай что-нибудь
— user3239222

Я немного изменил это, потому что первый пользователь настольного компьютера равен 1000, и есть другие типы пользователей, такие как «никто», поэтому нам также нужен верхний предел (который я просто произвольно установил на 2000):getent passwd | awk -F: '$3 >= 1000 && $3 < 2000 {print $1}'
— benjaoming

@benjaoming, да, да, >= 1000действительно, похоже, имеет смысл. Вопрос был > 1000по какой-то причине. nobodyкажется, обычно 6553xили 3276x, так что вы, вероятно, можете немного поднять этот верхний предел.
— ilkkachu

4

Эта конструкция не имеет особого смысла:

"$(id -u)" -gt "1000" </etc/passwd

Команда idработает независимо от перенаправления ввода. Перенаправление здесь не имеет смысла в любом случае.

Вы можете использовать этот конвейер в своем тестовом сравнении. Он покажет вам самый высокий идентификатор пользователя на машине:

cat /etc/passwd | awk -F: '{print $3}' | sort -n | tail -n1

Возможно, вы захотите настроить его для некоторых систем, так как может присутствовать nobodyпользователь с UID 65534.


1

Используя код Тома, это сработало для меня ..

#!/bin/sh
if grep -E '^[^:]*:[^:]*:[^:]{4}' /etc/passwd | grep -Evq '^[^:]*:[^:]*:1000:'
then 
    echo "exists"
else
    echo "not exists"
fi

я создал пользователя mrBlonde: x: 1001: 1001 :: / home / mrBlonde: / bin / bash. когда я запускаю код, который говорит, что существует, когда я удаляю пользователя, он говорит, что не существует. L)
— user3239222
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.