Я предполагаю, что UID, которые являются "локальными", находятся в отдельном диапазоне от "LDAP". Я также предполагаю, что nsswitch настроен на использование файлов и ldap для passwd, shadow и / group. Команда 'getent' должна присутствовать в системах GNU libc. Я собираюсь предположить, что локальные базы данных 'файлов' меньше, чем источник ldap, и поэтому мы захотим протестировать меньший и / или более быстрый из двух источников.
если вы хотите определить, присутствует ли данный UID, в одной из баз данных вы можете запустить что-то похожее на
$ getent --service=files passwd | grep 655
Это может совпадать с GID по умолчанию в файле, поэтому может потребоваться более творческий grep.
$ getent --service=files passwd | grep -e $.*:.*:655
Если вы хотите превратить это в элемент, способный работать со сценариями, то вам понадобится поставить 'wc' в конце, чтобы выполнить целочисленное тестирование.
$ getent --service=files passwd | grep -e $.*:.*:655 | wc -l
Возвращает 0, если не найден, или 1 (или более), если найден. Мы будем тестировать только один источник, потому что мы предполагаем, что мы тестируем действительный UID и что он будет в другом источнике, если его здесь нет.
Наконец, до тех пор, пока вы используете nsswitch, вы сможете использовать любую из библиотек C, которые поддерживают это, чтобы проверить, действительны ли они. У меня нет никакого личного опыта с ними, но я бы предположил, что вы можете передать опцию, как мы сделали здесь, чтобы использовать только конкретный источник. В качестве альтернативы вы можете использовать ту же логику, что и выше, и просто cat / etc / passwd. Снова предположим, что если их здесь нет, они находятся в ldap.