Избегайте всех символов, которые нужно экранировать в shell или sqlplus при любом заданном пароле
Вы можете попробовать сами, создав этого пользователя:
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>] | / | /NOLOG
<start> ::= @<URL>|<filename>[.<ext>] [<parameter> ...]
"-H" displays the SQL*Plus version banner and usage syntax
"-V" displays the SQL*Plus version banner
"-C" sets SQL*Plus compatibility version <v>
"-L" attempts log on just once
"-M <o>" uses HTML markup options <o>
"-R <n>" uses restricted mode <n>
"-S" uses silent mode
или же
-bash: *()_+=-~`": command not found
или же
-bash: syntax error near unexpected token `_+=-~\`\"'
или же
-bash: !@#$%^: event not found
и т.д. Цель состоит в том, чтобы код просто работал: sqlplus ${USER/bashfunction?}/${PW/bashfunction?} и происходит соединение.
Существует много руководств по двойному цитированию пароля, и я сделал это, но этого недостаточно. Я видел один про одинарные и двойные кавычки, но это тоже не помогло.
Если это невозможно, я тоже думаю, что это нормально, но я хотел бы знать, каковы ограничения, чтобы потом можно было передать их своим пользователям.
Я использую следующую версию Oracle, но этот ответ должен работать во всех выпусках sqlplus, возможно, выполняется в оболочке? SQL*Plus: выпуск 10.1.0.5.0 - производство в среду, 13 февраля 16:26:41 2019 г. Copyright (c) 1982, 2005, Oracle. Все права защищены.
Соединено с: Oracle Database 11g Enterprise Edition, выпуск 11.2.0.4.0 - 64-битное производство с опциями Partitioning, OLAP, Data Mining и Real Application Testing
SQL> exit Отключено от Oracle Database 11g Enterprise Edition, выпуск 11.2.0.4.0 - 64-битное производство с параметрами секционирования, OLAP, интеллектуального анализа данных и тестирования реальных приложений
Итак, сейчас я попробую с немного другой идеей, поместив сначала в переменную окружения:
user=karl
password="/?'!@#$%^&*()_+=-~`"
#failed. so tried
password="/?'\!@#$%^&*()_+=-~\`"
echo $password
/?'\!@#$%^&*()_+=-~` #seemed to work
sqlplus ${user}/"${password}"
Usage: SQLPLUS [ [<option>] [<logon>] [<start>] ]
2 ответа
Итак, правила Oracle просты. Тем не менее, оракул использует много специальных символов по-своему. Например, избегайте @, потому что oracle ожидает строку подключения после этого символа. Вот правила: если пароль не заключен в кавычки, он может содержать любую букву, любую цифру, символы "_", "#" или "$". В первом символе можно использовать только букву. Если вы заключите пароль в кавычки, вы можете использовать любой символ в любой позиции.
Однако, по моему опыту, всегда избегайте этого: _, %, @, \,/, потому что они могут запутать Oracle
Bash выдает эти ошибки, поскольку bash тоже нужно экранировать.
Дополнительная информация о выходе из bash: https://stackoverflow.com/questions/15783701/which-characters-need-to-be-escaped-when-using-bash
Чтобы проверить, что bash не обнаруживает ошибок с неэкранированными строками, вы можете echo
рассматриваемая строка. Если строка возвращается как ожидалось, строка правильно экранирована. Однако, если есть какие-либо ошибки, строка не экранирована правильно:
echo "/?'!@#$%^&*()_+=-~`"
bash: !@#: event not found
В этом случае, bash
оценил строку, потому что она в двойных кавычках, и попытался выполнить команду истории: http://tldp.org/LDP/abs/html/abs-guide.html
Это ожидаемое поведение, bash также подставляет переменные в двойные кавычки:
test=123
echo "Value of \$test: $test"
Value of $test: 123
Поэтому при вызове sqlplus
Команда, попробуйте использовать строки в одинарных кавычках. Bash не будет оценивать содержимое строк в одинарных кавычках.
Другим вариантом будет экранирование строки для bash при использовании строк в двойных кавычках.
Чтение содержимого переменной из stdin и последующее использование переменной в качестве аргумента команды - это еще один обходной путь, но он не всегда будет работать, поскольку содержимое переменных также может быть оценено.