Вы можете попробовать сами, создав этого пользователя:
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 г. Авторские права (c) 1982, 2005, Oracle. Все права защищены.
Подключено к: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64-разрядная производственная среда с опциями разбиения на разделы, OLAP, интеллектуального анализа данных и тестирования реальных приложений
SQL> exit Отключено от Oracle Database 11g Enterprise Edition Release 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>] ]
Итак, правила Oracle просты. Однако 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#HISTCOMMANDS
Это ожидаемое поведение, bash также заменяет переменные в строках с двойными кавычками:
test=123
echo "Value of \$test: $test"
Value of $test: 123
Поэтому при вызове sqlplus
попробуйте использовать строки в одинарных кавычках. Bash не будет оценивать содержимое строк в одинарных кавычках.
Другой вариант - экранировать строку для bash при использовании строк в двойных кавычках.
Чтение содержимого переменной из стандартного ввода и последующее использование переменной в качестве аргумента команды - это еще один обходной путь, но он не всегда работает, поскольку содержимое переменных тоже может быть оценено.