Вопрос или проблема
Вы можете попробовать сами, создав этого пользователя:
CREATE USER "karl" IDENTIFIED BY "/?'!@#$%^&*()_+=-~`"
(Может, есть другие символы, которые я должен был бы включить для своего тестирования, но это кажется хорошим началом)
Эти символы, похоже, все разрешены, и пользователь был создан.
Фактическая цель (причина, по которой я создал пароль) — подтвердить, что sqlplus, когда он запускается с правильным экранированием, может обрабатывать все пароли, которые могут быть переданы и могут быть действительными.
Итак, я запускаю это из bash, чтобы протестировать:
sqlplus karl/”/?’!@#$%^&*()_+=-~`”
и затем я пытался экранировать различные символы, чтобы выяснить.
Я получил ошибки в своих тестах, такие как:
Usage: SQLPLUS [ [<option>] [<logon>] [<start>] ]
where <option> ::= -H | -V | [ [-C <v>] [-L] [-M <o>] [-R <n>] [-S] ]
<logon> ::= <username>[/<password>][@<connect_identifier>] "https://serverfault.com/" /NOLOG
<start> ::= @<URL>|<filename>[.<ext>] [<parameter> ...]
"-H" отображает баннер версии SQL*Plus и синтаксис использования
"-V" отображает баннер версии SQL*Plus
"-C" устанавливает версию совместимости SQL*Plus <v>
"-L" пытается войти в систему только один раз
"-M <o>" использует параметры HTML-разметки <o>
"-R <n>" использует ограниченный режим <n>
"-S" использует тихий режим
или
-bash: *()_+=-~`": команда не найдена
или
-bash: ошибка синтаксиса рядом с неожиданным токеном `_+=-~\`\"'
или
-bash: !@#$%^: событие не найдено
и т. д.
Цель состоит в том, чтобы код просто работал:
sqlplus ${USER/bashfunction?}/${PW/bashfunction?} и произошла связь.
Существует много руководств по двойным кавычкам для пароля, и я это делал, но этого недостаточно. Я видел одно о одинарных и двойных кавычках, но это тоже не помогло.
Если это невозможно, тоже ничего, я думаю, но я хотел бы знать, какие ограничения существуют, чтобы я мог передать их своим пользователям.
Версия Oracle, которую я использую, следующая, но этот ответ должен работать во всех версиях sqlplus, возможно, выполняемых в оболочке?
SQL*Plus: Версия 10.1.0.5.0 – Производство в среду 13 февраля 2019 года в 16:26:41
Авторские права (c) 1982, 2005, Oracle. Все права защищены.
Подключено к:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 – 64bit Production
С опциями разделения, OLAP, Data Mining и Real Application Testing
SQL> выход
Отключено от Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 – 64bit Production
С опциями разделения, OLAP, Data Mining и Real Application Testing
Так что я попробую немного другой подход сейчас, сначала поместив в переменную окружения:
user=karl
password="/?'!@#$%^&*()_+=-~`"
#не удалось. поэтому попробовал
password="/?'\!@#$%^&*()_+=-~\`"
echo $password
/?'\!@#$%^&*()_+=-~` #похоже, сработало
sqlplus ${user}/"${password}"
Usage: SQLPLUS [ [<option>] [<logon>] [<start>] ]
Bash выбрасывает эти ошибки, поскольку bash также требует экранирования.
Дополнительная информация об экранировании bash: https://stackoverflow.com/questions/15783701/which-characters-need-to-be-escaped-when-using-bash
Чтобы протестировать, что bash не встречает никаких ошибок с неэкранированными строками, вы можете echo
строку, о которой идет речь. Если строка возвращается, как ожидается, строка правильно экранирована. Если же возникают какие-либо ошибки, строка не экранирована должным образом:
echo "/?'!@#$%^&*()_+=-~`"
bash: !@#: событие не найдено
В этом случае bash
оценил строку, потому что она в двойных кавычках, и попытался выполнить команду истории: http://tldp.org/LDP/abs/html/abs-guide.html#HISTCOMMANDS
Это ожидаемое поведение, bash также заменяет переменные в строках с двойными кавычками:
test=123
echo "Value of \$test: $test"
Value of $test: 123
Поэтому, когда вы вызываете команду sqlplus
, попробуйте использовать строки в одинарных кавычках. Bash не будет оценивать содержимое строк в одинарных кавычках.
Другим вариантом будет экранирование строки для bash при использовании строк в двойных кавычках.
Чтение содержимого переменной из stdin и затем использование переменной в качестве аргумента к команде — это еще одно обходное решение, но оно не всегда сработает, так как содержимое переменных также может быть оценено.
Итак, правила Oracle просты. Тем не менее, Oracle использует множество специальных символов по-своему. Например, избегайте @, потому что Oracle ожидает строку подключения после этого символа. Вот правила:
если пароль не заключен в кавычки, он может включать любую
букву, любую цифру, “_”, “#” или “$” символы. Только буква может быть использована
в первом символе. Если вы заключите пароль в кавычки, вы можете использовать
любой символ в любой позиции.
Тем не менее, по моему опыту, избегайте этих символов всегда: _, %, @, \,/ потому что они, вероятно, запутают Oracle
Ответ или решение
Экранирование специальных символов в паролях для SQLPlus
Вопрос экранирования символов в паролях для использования в SQLPlus важен для безопасной и корректной аутентификации в Oracle Database. Данная инструкция освещает способы экранирования символов, используемого в паролях, а также проблемы, которые могут возникнуть при их использовании в Bash и SQLPlus.
Проблематика
Вы пытаетесь выполнить команду для подключения к базе данных Oracle, используя сложный пароль. Пример пароля, создаваемого с помощью команды:
CREATE USER "karl" IDENTIFIED BY "/?'!@#$%^&*()_+=-~`"
Однако, когда вы используете этот пароль в SQLPlus, Bash не может корректно интерпретировать его из-за присутствия специальных символов. Вот некоторые потенциальные ошибки:
bash: *()_+=-~
: команда не найденаbash: !@#: event not found
: неожиданное поведение, связанное с историей команд-bash: syntax error near unexpected token
: синтаксическая ошибка
Проблема заключается в том, что не все специальные символы могут быть обработаны Bash без предварительного экранирования, и аналогично, некоторые из них могут быть неправильно интерпретированы самими SQLPlus.
Эскейпинг символов в Bash
-
Использование одинарных кавычек: Одинарные кавычки (
'
) защищают содержимое от интерпретации Bash. Вся строка внутри одинарных кавычек будет восприниматься как обычный текст.Пример:
sqlplus karl/'/\'\?\'\!\@\$\%\^\&\*\(\)\_\+\=\-\~\`'
-
Экранирование с помощью обратной косой черты: Если вы решили использовать двойные кавычки, экранируйте каждый специальный символ с помощью обратной косой черты (
\
).Пример:
password="/?'\"!@#\$%\^&\*\(\)_\+=-~\`" sqlplus karl/"$password"
Рекомендации по паролям в Oracle
Oracle позволяет использовать большинство символов в паролях, особенно если они заключены в двойные кавычки. Тем не менее, есть некоторые ограничения, которые стоит учитывать:
- Допустимые символы: Можно использовать буквы, цифры, символы
_
,#
,$
. Однако важно, чтобы первым символом был элемент из букв. - Избегайте символов
@
,%
,_
,/
: Эти символы могут вызывать путаницу при обработке строки подключения. - Если пароль не заключен в кавычки, лучше всего использовать только буквы, цифры и некоторые специальные символы.
Пример на основе вашего пользовательского случая
user="karl"
password='/\'\?\'\!\@\$\%\^\&\*\(\)\_\+\=\-\~\`'
sqlplus ${user}/${password}
Проверка корректности
Перед выполнением команды вы можете протестировать строку пароля с помощью:
echo "${password}"
Если строка отображается корректно, вы готовы к выполнению команды. В противном случае вам нужно будет дополнительно экранировать символы.
Заключение
Экранирование символов в паролях, используемых с SQLPlus, требует внимания в связи с особенностями обработки Bash и SQLPlus. Следуя приведенным рекомендациям и избегая использования проблемных символов, вы сможете гарантировать, что соединение с вашей базой данных пройдет гладко.