Как использовать переменную bash со специальными символами [duplicate]

Я перешел с рабочего ноутбука на Windows 7 на рабочий ноутбук в Windows 10. Я успешно использовал SSMS2016 в Windows 7.

Эта же проблема была применена с использованием SSMS2012 или SSMS2016. Мой доступ к серверам с 10 окнами, использующими проверку подлинности Windows, остался прежним. Я могу проверить это с другого сервера. Однако 2 из 10 серверов не будут подключаться из моего ноутбука. Оба были ms sql server 9, но я мог подключиться к другим базам данных sql server 9.

Решение заключалось в том, чтобы добавить правило брандмауэра (используя брандмауэр Windows с повышенной безопасностью).

Создать Входящее правило для каждой SSMS, например, C: \ Program Files (x86) \ Microsoft SQL Server \ 130 \ Tools \ Binn \ ManagementStudio \ Ssms.exe

Я не эксперт по сети, поэтому я не включил подробности, но, надеюсь, он укажет вам в правильном направлении.


Ошибка msg (pre брандмауэр-правило) "При установлении соединения с SQL Server возникла связанная с сетью или конкретная ошибка экземпляра. сервер не найден или недоступен. Убедитесь, что имя экземпляра верное и что SQL Server настроен на разрешение удаленных подключений. (поставщик: сетевые интерфейсы SQL, ошибка: 26 - ошибка определения местоположения сервера / экземпляра) (.Net SqlClient Data Provider) "

1
задан Cyrus 21 January 2017 в 19:57
поделиться

2 ответа

Я вижу две потенциальные проблемы с тем, как вы читаете и используете пароль:

  • Когда вы используете команду 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 перед командой ldapaddset +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 не дублируется. Это потому, что в нем нет каких-либо специальных символов, поэтому двойные кавычки ничего не делают, поэтому они просто оставили их.

1
ответ дан Gordon Davisson 18 August 2018 в 22:11
поделиться

Поместите его в двойные кавычки и избегайте символа $, чтобы избежать специальной интерпретации из shell,

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

На странице man bash,

Прикрепленные символы в двойных кавычках сохраняют буквальное значение всех символов в кавычках , за исключением $,, \, и, когда расширение истории включено,!. Символы $ и сохраняют свое особое значение в двойных кавычках. Обратная косая черта сохраняет свое особое значение только тогда, когда за ней следует один из следующих символов: $, `, ', \ или. Двойная кавычка может быть заключена в двойные кавычки, предшествуя ей обратным слэшем. Если включено, будет выполнено расширение истории если в двойных кавычках не будет выведена, а обратная косая черта, предшествующая символу!, не будет удалена.

1
ответ дан Inian 18 August 2018 в 22:11
поделиться
  • 1
    Одинарные кавычки были бы предпочтительнее, так как это не требует выделения $ отдельно. Выход из финального $ является необязательным, поскольку для запуска расширения параметра не существует следующего символа. – chepner 21 January 2017 в 18:23
Другие вопросы по тегам:

Похожие вопросы: