Вопрос или проблема
У меня есть 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-структуры.