Как извлечь атрибут из вывода ldapsearch

Вопрос или проблема

У меня есть LDAP-каталог, который содержит несколько экземпляров класса под названием store, например так:

# ldapsearch -LLL -x -b "utente=las,dc=labammsis" -s base
dn: utente=las,dc=labammsis
objectClass: store
utente: las
indirizzo: 10.1.1.1
chiave: ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAA
 CFBAHTwDePWTXkV32Ggso3fxFHqJ9iPbiAiZ5TadkCIv1gF6GGVsHBUtfq+OuGwOCaDAdi/FXuxt2
 5Be4K0NGlmkwPvABaT3O6pXvA2ucUNzRm/dPME+kwMPc2lWT2MYOnjZ6TBiMl/PVXqHLREZjEJNDX
 4nW6C+7SgGA4d0FGIB+wKEy1gg== las@Client
modificato: 1

Я хочу извлечь только атрибуты типа chiave, поэтому желаемый вывод такой:

ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAHTwDePWTXkV32Ggso3fxFHqJ9iPbiAiZ5TadkCIv1gF6GGVsHBUtfq+OuGwOCaDAdi/FXuxt25Be4K0NGlmkwPvABaT3O6pXvA2ucUNzRm/dPME+kwMPc2lWT2MYOnjZ6TBiMl/PVXqHLREZjEJNDX4nW6C+7SgGA4d0FGIB+wKEy1gg== las@Client

Искнув в интернете, я нашел эту полезную ссылку, так что я смог сделать так:

# ldapsearch -LLL -x -b "utente=las,dc=labammsis" -s base chiave
dn: utente=las,dc=labammsis
chiave: ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAA
 CFBAHTwDePWTXkV32Ggso3fxFHqJ9iPbiAiZ5TadkCIv1gF6GGVsHBUtfq+OuGwOCaDAdi/FXuxt2
 5Be4K0NGlmkwPvABaT3O6pXvA2ucUNzRm/dPME+kwMPc2lWT2MYOnjZ6TBiMl/PVXqHLREZjEJNDX
 4nW6C+7SgGA4d0FGIB+wKEy1gg== las@Client

Неплохо, но не совсем то, что я хотел.

Есть ли способ добиться своей цели, используя только параметр ldapsearch, или мне стоит обработать вывод, чтобы получить желаемый результат?

Вы можете отключить перенос строк с помощью -o ldif-wrap=no, после этого вам только нужно отфильтровать вывод, например с помощью sed:

ldapsearch -LLL -x -b "utente=las,dc=labammsis" -s base -o ldif-wrap=no chiave \
| sed -ne 's/^chiave: //p'

Обратите внимание, что некоторые значения атрибутов (например, имена с умлаутами или даже неалфавитные символы) могут быть закодированы в BASE64, поэтому используется :: в качестве разделителя.
Поэтому вы можете добавить это между выводом ldapsearch и вводом sed:

ldapsearch ... |
while read t v
do
    if [ "_${t%::}" != "_$t" ]; then
        echo "${t%:} $(echo $v | base64 --decode)"
    else
        echo "$t $v"
    fi
done | sed ...

Ответ или решение

Чтобы извлечь атрибуты типа chiave из вывода команды ldapsearch, вы можете использовать несколько методов, включая параметры самой команды и последующую обработку вывода. Рассмотрим этот процесс более подробно.

Шаг 1: Получение нужного атрибута

Чтобы извлечь атрибут chiave, вы уже сделали первый шаг, используя команду:

ldapsearch -LLL -x -b "utente=las,dc=labammsis" -s base chiave

Однако, как вы заметили, вывод включает обертку строк, что затрудняет дальнейшую обработку.

Шаг 2: Отключение обертки строк

Чтобы отключить обертку строк в выводе, вы можете воспользоваться параметром -o ldif-wrap=no. Это позволит вам получить атрибуты в удобочитаемом формате:

ldapsearch -LLL -x -b "utente=las,dc=labammsis" -s base -o ldif-wrap=no chiave

Шаг 3: Фильтрация вывода

Для извлечения только нужного значения атрибута chiave, необходимо обработать вывод, используя стандартные инструменты командной строки, такие как sed. Ваш код с использованием sed выглядит следующим образом:

ldapsearch -LLL -x -b "utente=las,dc=labammsis" -s base -o ldif-wrap=no chiave | sed -ne 's/^chiave: //p'

Эта команда удаляет все строки, кроме тех, которые начинаются с chiave:, и удаляет префикс chiave:, оставляя только значение.

Шаг 4: Обработка закодированных значений

Следует учитывать, что значения атрибутов могут быть закодированы в Base64, если они содержат не ASCII символы. В таком случае необходимо добавлять обработку для этих значений. Пример кода может выглядеть так:

ldapsearch -LLL -x -b "utente=las,dc=labammsis" -s base -o ldif-wrap=no chiave | while read -r line
do
    # Проверяем, закодировано ли значение Base64
    if [[ "$line" =~ :: ]]; then
        # Извлекаем имя и значение
        attribute=${line%%::*}
        base64_value=${line##*::}
        # Декодируем значение
        decoded_value=$(echo "$base64_value" | base64 --decode)
        echo "$attribute $decoded_value"
    else
        echo "$line"
    fi
done | sed -ne 's/^chiave: //p'

Здесь мы проверяем, содержит ли строка символы ::, и при наличии декодируем значение с помощью команды base64 --decode.

Заключение

Таким образом, для извлечения нужного атрибута из вывода команды ldapsearch, вам необходимо использовать несколько параметров и стандартных инструментов Linux для обработки текста. Первый шаг — отклонение обертки строк, вторым — фильтрация вывода с помощью sed, а в случае необходимости декодирования — проверка на наличие символов :: и соответствующая обработка.

Этот подход позволит вам с высокой точностью и без лишних усилий получать требуемые данные из вашей LDAP-структуры.

Оцените материал
Добавить комментарий

Капча загружается...