Я пишу сценарий для автоматизации ldap и немного завис. По сути, я хочу проверить, действительно ли атрибут, добавляемый к записи, существует в данном objectClass, прежде чем я попытаюсь его добавить.
Пока что лучшая идея, которая у меня есть для этого, - это просто запустить регулярное выражение в файле определения схемы для атрибута, но это не учитывает файл схемы, редактируемый после инициализации конфигурации.
Вторая мысль заключалась бы в том, чтобы просто поймать ошибку, возникающую, если атрибут не может быть добавлен, но это кажется менее эффективным, поскольку следующим моим шагом будет добавление атрибута в схему и перестройку конфигурации.
Похоже, для этого должна быть простая команда ldapsearch, но я не могу понять синтаксис.
пока я пробовал:
ldapsearch -x -b 'dc=MY_DOMAIN,dc=com' '(objectclass=mySCHEMA)'
но это просто список всех записей ldap, в которых есть объектный класс mySCHEMA.
Спасибо за помощь, ура!
Вы ищете subschemaSubentry
.
RFC 2252
Облегченный протокол доступа к каталогам (v3): определения синтаксиса атрибутов
5.1.5. подсхема
Значением этого атрибута является имя записи подсхемы (или подстатьи, если сервер основан на X.500 (93)), в которой сервер делает доступными атрибуты, определяющие схему.
( 2.5.18.10 NAME 'subschemaSubentry' EQUALITY distinguishedNameMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 NO-USER-MODIFICATION SINGLE-VALUE USAGE directoryOperation )
Вы можете найти это так:
$ ldapsearch -s base -b '' subschemaSubentry
dn:
subschemaSubentry: cn=Subschema
$ ldapsearch -s base -b cn=Subschema objectClasses
Одной строкой:
ldapsearch -s base -b $(ldapsearch -s base -b '' subschemaSubentry | sed '/dn:/d;/^$/d;s/subschemaSubentry: //' ) objectClasses
Если вы пишете сценарии в bash и ваша версия ldapsearch поддерживает это, -o ldif-wrap=no
будет означать, что вам не нужно разбирать перенос строки ldif.
cn=schema,cn=config
, хотя и удобен, обычно недоступен в OpenLDAP из-за контроля доступа, унаследованного от cn=config
.
Это то, что я использую, чтобы показать схему конкретный objectClass, например organizationalRole
$ ldapsearch -s base -b cn=Subschema objectClasses -LLL -o ldif-wrap=no |\
sed -nr '/organizationalRole/ p' | sed -r 's/[$()]+/\n /g'
Прошло много времени с тех пор, как я работал с LDAP, но я думаю, что каждый сервер LDAP может предоставлять схему в определенном суффиксе.
Я думаю, что в Openldap вы можете искать в базе «cn = schema, cn = config», чтобы найти текущую схему. Попробуйте что-нибудь вроде ldapsearch -x -s sub -b "cn=schema,cn=config" '(objectclass=*)'
чтобы увидеть, что вы получите. (Не тестировал эту командную строку, но вы поняли ...).
С точки зрения разработчика, я ожидал бы, что существует правильная схема, и обрабатывать исключение нарушения объектного класса, как если бы это была какая-либо ошибка.
Я думаю, что изменение схемы должно выполняться не приложением, которое добавляет / удаляет данные, а процедурой установки программного обеспечения.
Простые сценарии оболочки / awk не работают вообще из-за наследования классов объектов. Вы должны оценить это, чтобы действительно узнать заранее, что сервер LDAP будет делать с вашим запросом на добавление / изменение. (По крайней мере, я понимаю, чего вы хотите достичь.)
Если вы не против написания сценариев на Python, вы можете использовать модуль python-ldap ldap.schema который я реализовал для полной поддержки схемы в web2ldap. Помимо наследования классов объектов, он также заботится о правилах содержимого DIT, что очень важно для правильного получения списков атрибутов с помощью MS AD.
Будьте осторожны: реализовать общее решение нетривиально! И в зависимости от используемого сервера LDAP вы обнаружите несколько неполные ссылки на схемы, и вам придется здесь и там реализовывать обработку отката.
Я знаю только точно один Реализация клиента LDAPv3 полный Поддержка схемы LDAP. ;-)
Если вы предпочитаете решение с графическим интерфейсом, загрузите браузер LDAP, например бесплатную кроссплатформенную версию с открытым исходным кодом. JXplorer. После подключения к LDAP он позволяет просматривать (и редактировать) все объекты и их атрибуты.