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

Другие вопросы по тегам