如何在 linux 上使用包含 @ 的密码和 sqlplus 18、19 或 21?

How to use password containing @ with sqlplus 18, 19 or 21 on linux?

我有 ORACLE 帐户,密码为 at 符号 (@)。

我使用的是 sqlplus 12,我可以用这个语法处理这个特殊字符:

sqlplus 'USER/\"@PWD\"@SERVER:1521/BASE'

现在用sqlplus 19,这个不行了。而且在多个OS(RHEL7 RHEL8 CentOS7)上多次测试(sqlplus v18 v19和v21),问题还是一样。我已经测试了很多转义方法并在整个互联网上搜索但没有找到任何有效的方法。

这个问题好像是@符号特有的,我可以转义了!以 \ 为例。

编辑:我需要自动执行此操作,因此人工交互的解决方案无法解决我的问题。

您可以通过在 sqlplus 内部连接来解决这个问题,顺便说一句,如果您想将连接封装在 shell 脚本中,这会好得多。

让我向您展示(Red Hat 7 上的 Oracle 19c)

SQL> select version from v$instance ;

VERSION
-----------------
19.0.0.0.0

SQL> create user test identified by "Ora@xde1" ;

User created.

SQL> grant connect to test ;

Grant succeeded.

如果在命令行中连接,它不起作用

sqlplus test/"Ora@xde1"

SQL*Plus: Release 19.0.0.0.0 - Production on Fri Sep 10 13:07:28 2021
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

ERROR:
ORA-12154: TNS:could not resolve the connect identifier specified

但是,如果您在内部连接,它确实有效

sqlplus /nolog

SQL*Plus: Release 19.0.0.0.0 - Production on Fri Sep 10 13:08:05 2021
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

SQL> conn test/"Ora@xde1"
Connected.
SQL> select 1 from dual ;

         1
----------
         1

根据@Roberto Hernandez 的回答,我使用他的解决方案进行了一些修改以在脚本内部工作,而无需交互式输入密码:

sqlplus /nolog << EOF\nconn <user>/"<password>"@<server>:1521/<base>\n@"<script>"