Я вижу две потенциальные проблемы с тем, как вы читаете и используете пароль:
read
без , параметр -r
, он попытается интерпретировать последовательности escape (обратная косая черта), что может вызвать проблемы. Исправление этих потенциальных проблем дает этот фрагмент сценария:
read -rs -p "Password : " bindDNPass
ldapadd -H ldap://localhost -x -w "$bindDNPass" -D "dn=cn=Admin" -f /tmp/file.ldif
... Но, хотя вы должны сделать оба этих мода, чтобы сделать ваш скрипт более надежным, ни один из них не изменит, как он обрабатывает пароль $Something18$
. Фактически, когда я попробовал свой оригинальный фрагмент с этим паролем, он был правильно принят ldapadd
. Если у вашего фактического пароля есть другие специальные символы (или вы играли со значением IFS
), это может помочь; в противном случае происходит что-то еще.
Если ваш пароль по-прежнему не работает после этих исправлений, попробуйте поместить set -x
перед командой ldapadd
(и set +x
после), чтобы он печатал что на самом деле передается ldapadd
. Ну, он напечатает его в возможной запутанной форме: он выведет эквивалентную команду на то, что на самом деле выполняется, что означает, что при необходимости он добавит кавычки и / или экраны в параметр пароля так что вы можете запустить эту команду, и она сделает то же самое. Когда я попробовал это с помощью $Something18$
, он напечатал:
+ ldapadd -H ldap://localhost -x -w '$Something18$' -D dn=cn=Admin -f /tmp/file.ldif
... где одиночные кавычки означают, что то, что внутри них, передается напрямую, без синтаксического анализа. Он также мог напечатать любую из следующих эквивалентных команд:
+ ldapadd -H ldap://localhost -x -w \$Something18\$ -D dn=cn=Admin -f /tmp/file.ldif
+ ldapadd -H ldap://localhost -x -w "\$Something18\$" -D dn=cn=Admin -f /tmp/file.ldif
+ ldapadd -H ldap://localhost -x -w $'$Something18$' -D dn=cn=Admin -f /tmp/file.ldif
, поэтому вам нужно взять то, что он печатает, и выяснить, как это будет обрабатываться bash, чтобы выяснить, что на самом деле передается ldapadd
. Но, по крайней мере, это даст вам некоторую информацию о том, что на самом деле происходит.
О, и вы можете заметить, что аргумент DN не дублируется. Это потому, что в нем нет каких-либо специальных символов, поэтому двойные кавычки ничего не делают, поэтому они просто оставили их.
Здесь может помочь узел String Manipulation с regexMatcher
, хотя результатом будет String (со значениями True
/ False
по умолчанию), поэтому потребуется дополнительный узел, если для Например, требуется число (если другая строка, вы можете использовать троичный оператор ?
/ :
, например == "True" ? "when true" : join("when false it was because '", $columnReference$, "' was not found")
).
Вы можете использовать regexMatcher
следующим образом ( \Q
/ \E
помогает избежать обработки содержимого столбца Reference
как регулярного выражения (кроме случаев, когда оно содержит \E
)) :
regexMatcher($text$, join(".*?\\Q", $Reference$, "\\E.*+")) == "True" ? "vrai" : "faux"
Механизм правил допускает использование групповых символов с оператором LIKE, но не позволяет использовать групповые символы в сочетании со столбцами, что означает, что следующее будет работать нормально:
$column1$ LIKE "*test*" => "1"
Следующее также разрешено, но не будет работать нормально:
$column1$ LIKE "*$column2$*" => "1"
Причина в том, что когда вы получили двойные кавычки, $ не распознается, поэтому вы не получаете значения из column2. Вместо этого вы каждый раз получаете одну и ту же строку: "*$column2$*"
, а это не то, что вам нужно.
Кроме того, вы можете использовать функцию indexOf()
в узле String Manipulation или Column Expressions, которая будет возвращать первую позицию строкового значения из column1 в column2. Если не найдено, функция вернет -1. Затем добавьте узел Rule Engine, чтобы добавить соответствующее указание.