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

8

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

if [ "$(id -u)" -gt "1000" </etc/passwd]; then
    do something
else
    do something else
fi
user3239222
источник
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}'
ilkkachu
источник
как бы я использовал это с оператором 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
user3239222
источник
я создал пользователя mrBlonde: x: 1001: 1001 :: / home / mrBlonde: / bin / bash. когда я запускаю код, который говорит, что существует, когда я удаляю пользователя, он говорит, что не существует. L)
user3239222