Создать сценарий оболочки для ldapsearch с входным файлом

У меня есть список пользователей в текстовом файле. Мне нужно запросить Active Directory нашего кампуса, чтобы убедиться, что эти пользователи все еще являются «активными» пользователями (мои машины не являются частью AD кампуса). Список пользователей сопоставляется с рядом идентичных атрибутов в AD (name, cn, sAMAccountName, uid, gecos). Я могу успешно запросить AD с помощью ldapsearch для отдельных пользователей, поэтому я пытаюсь выяснить следующее:

а) как использовать файл в качестве входных данных для запроса

б) как создать сценарий оболочки, чтобы запрос выполнялся построчно, а затем выводил всех «неактивных» пользователей, чтобы я мог отправить его по электронной почте для уведомления.

Буду признателен за любую оказанную помощь.


person stephenswmed    schedule 10.12.2015    source источник
comment
Попробуйте что-то вроде while read -r line; do myldapsearch "${line}"; done < userlist и покажите, где вы застряли.   -  person Walter A    schedule 11.12.2015


Ответы (2)


Что-то, что вы могли бы попытаться выполнить, чего вы хотите:

emailFile="/var/tmp/emailFile.txt"
for i in $(cat ${filename}) ; do
  results=$(*INPUT LDAPSEARCH HERE REPLACING USERNAME WITH ${i}* | grep -i lastlogontimestamp)
  if [[ ${results} != "" ]] ; then
    echo "${i} appears to be an active user"
  else
    echo "${i} IS INACTIVE"
    echo "${i}" >> "${emailFile}"
  fi
done

Это НЕ рабочий сценарий, но он должен дать вам очень хорошее представление о том, как заставить его работать в вашей среде. Пара вещей на заметку...

${filename} = местоположение/имя файла вашего списка имен

ВВЕДИТЕ ЗДЕСЬ LDAPSEARCH, ЗАМЕНЯЯ USERNAME НА ${i} = Вы должны ввести свою команду, чтобы запустить здесь поиск ldap. пример $(ldapsearch -D "cn=manager" -w пароль -h server.example.com -b "dc=example,dc=com" "cn=${i}" | grep -i "отметка времени последнего входа")

«lastlogontimestamp» будет соответствовать той части запроса, которую вы хотите проверить, чтобы определить, активен пользователь или нет.

Это установит переменную ${results} в строку, которую вы ищете. Это может быть отметка даты или пустое значение, если пользователи никогда не входили в систему.

Следующий оператор «если» сравнит результаты со строкой/шаблоном, которые вы ожидаете. В моем операторе if выше говорится, что если ${results} не равно ничему, то сообщать вам, что пользователь, которого вы искали, активен. Если ${results} действительно пусты, запишите имя пользователя.

Вам придется изменить часть ldapsearch, чтобы она соответствовала вашим потребностям, и оператор if, чтобы он соответствовал тому, что вы ожидаете увидеть в своем запросе, если пользователь не активен. Надеюсь, это поможет.

person IT_User    schedule 10.12.2015
comment
Это фантастика - именно то, что я искал. Одно примечание: строка echo "${i} >> ${emailFile}" на самом деле должна быть: echo "${i}" >> "${emailFile}", что я заметил, когда файл не создавался. Большое спасибо!! - person stephenswmed; 11.12.2015
comment
Совершенно никаких проблем. Спасибо за улов. Я обновил свой ответ соответственно. У меня не было рядом системы, чтобы проверить это, иначе я бы поймал ее заранее. - person IT_User; 11.12.2015
comment
Играя с ним дальше, я думаю, что я хочу запросить UserAccountControl в качестве атрибута. Если значение равно 514 или 546, этот пользователь будет найден в файле. Это даст мне лучшее представление о том, включена учетная запись пользователя или нет (это действительно та информация, которая мне нужна). Можно ли добавить секунду или условие для использования и 514 и 546 (а может и других)? На данный момент у меня есть два скрипта, каждый из которых работает, но кажется, что их можно комбинировать (если бы я знал, как это написать). - person stephenswmed; 11.12.2015
comment
Я также заметил, что если я добавляю фиктивного пользователя, которого нет в AD, он все равно сообщает, что он активен. Я думал, что если он не найдет его, это приведет к ошибке, но я предполагаю, что нужно выполнить дополнительное условие? - person stephenswmed; 11.12.2015
comment
если бы вы могли вставить свой сценарий, я мог бы дать более подробный ответ. Надеюсь, мой второй ответ ниже является хорошей ссылкой для поиска более чем одной строки, а также для запуска нескольких операторов if внутри друг друга. У вас может быть первый оператор if, который проверяет, существует ли пользователь с помощью какого-либо типа поиска/переменной, а второй оператор if может grep для 514\|546, и если он находит это, отправляет имя пользователя в файл. Просто некоторые идеи. - person IT_User; 11.12.2015

Чтобы ответить на ваш вопрос, который вы задали в комментариях...

Вы можете использовать вложенные выражения if. Пример.

if [[ $(some command) = "Some expected result" ]] ; then
  if [[ ${results} != "" ]] ; then
    echo "${i} appears to be an active user"
  else
    echo "${i} IS INACTIVE"
    echo "${i}" >> "${emailFile}"
  fi
fi
done

Вы можете добавить вторую переменную, где вы запускаете команду в цикле for, например

userExists=$(some ldapsearch command to see if user exists)
results=$(*INPUT LDAPSEARCH HERE REPLACING USERNAME WITH ${i}* | grep -i lastlogontimestamp
if [[ ${userExists} = "Some expected result" ]] ; then
  if [[ ${results} != "" ]] ; then

Вы также задали вопрос об использовании «grep» для поиска более чем одного элемента. Пример ниже.

grep "514\|546"

Пример 2. Допустим, у меня есть файл с именем test.txt из 5 строк.

one
two
three
four
five

Я бы запустил следующую команду, чтобы заглянуть внутрь файла и найти «два» и «три».

cat test.txt | grep "two\|three"
person IT_User    schedule 11.12.2015