Назад | Перейти на главную страницу

Экранировать все символы, которые оболочка или 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 г. Авторские права (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 при использовании строк в двойных кавычках.

Чтение содержимого переменной из стандартного ввода и последующее использование переменной в качестве аргумента команды - это еще один обходной путь, но он не всегда работает, поскольку содержимое переменных тоже может быть оценено.