您可以通过创建此用户亲自尝试:
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 版本,也许是在 shell 中执行的?SQL*Plus:版本 10.1.0.5.0 - 2019 年 2 月 13 日星期三 16:26:41 制作版权所有 (c) 1982, 2005,Oracle。保留所有权利。
连接到:Oracle Database 11g Enterprise Edition 版本 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>] ]
答案1
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 的字符串进行转义。
从 stdin 读取变量的内容,然后使用该变量作为命令的参数是另一种解决方法,但并不总是有效,因为变量的内容也可能被评估。
答案2
因此,Oracle 规则很简单。但是,Oracle 以自己的方式使用许多特殊字符。例如,避免使用 @,因为 Oracle 期望该字符后有一个连接字符串。规则如下:如果密码未用引号括起来,则可以包含任何字母、任何数字、“_”、“#”或“$”字符。第一个字符只能使用字母。如果将密码括在引号中,则可以在任何位置使用任何字符。
但是,根据我的经验,请始终避免使用这些:_、%、@、\、/,因为它们可能会混淆 Oracle