带有sqlplus的Shell脚本和密码上的特殊字符

时间:2018-01-28 22:15:09

标签: linux bash oracle shell sqlplus

我有一个混合Linux / Unix shell脚本和sqlplus(Oracle)的问题让我发疯。 : - )

sqlplus使用这样的语法:

./sqlplus johnF/mypassword@127.0.0.1:1521/SID

它工作正常。但是我的密码并不简单,因为" mypassword",它使用"!"和" @"有时甚至是" \"。对于此示例,我们假设我的密码是!p @ ssword

如果我在sqlplus中使用以下语法,它可以工作:

./sqlplus johnF/'"!p@ssword"'@127.0.0.1:1521/SID

太棒了。但是我想在shell脚本中使用它来获取调用sqlplus并从文件中获取许多参数(用户名,密码,SID和SQL QUERY),例如让我使用简化代码。

#!/bin/bash

while IFS=: read -r line
do

        echo "./sqlplus johnF/$line@127.0.0.1:1521/SID" 
        echo -e 'select 1 from dual;\nexit;' |  ./sqlplus johnF/$line@127.0.0.1:1521/SID

done < $1

我试图以多种方式修复它,包括:

echo -e 'select 1 from dual;\nexit;' |  ./sqlplus johnF/'"$line"'@127.0.0.1:1521/SID
echo -e 'select 1 from dual;\nexit;' |  ./sqlplus johnF/'\"$line\"'@127.0.0.1:1521/SID
echo -e 'select 1 from dual;\nexit;' |  ./sqlplus johnF/\'\"$line\"\'@127.0.0.1:1521/SID

许多其他人都失败了,在少数情况下,第一个echo打印输出完全应该传递给sqlplus,但它永远不会起作用,返回登录被拒绝(密码错误)或连接问题(可能@被截获作为错误的目标)。

如何解决这个难题?

感谢。

3 个答案:

答案 0 :(得分:2)

配置配置文件sqlnet.ora以便轻松连接。

NAMES.DIRECTORY_PATH= (TNSNAMES,ezconnect)

将密码@T!ger更改为用户&#34; Scott&#34;。

oracle@esmd:~>
oracle@esmd:~> sqlplus / as sysdba

SQL*Plus: Release 11.2.0.3.0 Production on Mon Jan 29 11:05:04 2018

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


Connected to:
Oracle Database 11g Release 11.2.0.3.0 - 64bit Production

SQL> alter user "Scott" identified by "@T!ger";

User altered.

示例1 脚本是test_echo.sh

    #!/bin/sh

    username=\"Scott\"
    password=\"@T!ger\"
    ezconnect=10.89.251.205:1521/esmd

    echo username:  $username
    echo password:  $password
    echo ezconnect  $ezconnect

 echo -e 'show user \n  select 1 from dual;\nexit;' |  sqlplus  $username/$password@$ezconnect

oracle@esmd:~> ./test_echo.sh
username: "Scott"
password: "@T!ger"
ezconnect 10.89.251.205:1521/esmd

SQL*Plus: Release 11.2.0.3.0 Production on Mon Jan 29 11:02:52 2018

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


Connected to:
Oracle Database 11g Release 11.2.0.3.0 - 64bit Production

SQL> USER is "Scott"
SQL>
         1
----------
         1

SQL> Disconnected from Oracle Database 11g Release 11.2.0.3.0 - 64bit Production

示例2 以静默方式运行脚本test_echo.sh sqlplus

#!/bin/sh

username=\"Scott\"
password=\"@T!ger\"
ezconnect=10.89.251.205:1521/esmd

echo username:  $username
echo password:  $password
echo ezconnect  $ezconnect
echo -e 'show user \n  select 1 from dual;\nexit;' |  sqlplus -s  $username/$password@$ezconnect

oracle@esmd:~> oracle@esmd:~> ./test_echo.sh
username: "Scott"
password: "@T!ger"
ezconnect 10.89.251.205:1521/esmd
USER is "Scott"

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

示例3 一点点另一种语法

#!/bin/sh

username=\"Scott\"
password=\"@T!ger\"
ezconnect=10.89.251.205:1521/esmd


echo username:  $username
echo password:  $password
echo ezconnect: $ezconnect

testoutput=$(sqlplus -s $username/$password@$ezconnect  << EOF
set pagesize 0 feedback off verify off heading off echo off;
show user
SELECT to_char(sysdate,'DD-MM-YYYY HH24:MI')||' Test passed' from dual
exit;
EOF
)

echo $testoutput

oracle@esmd:~> ./test_Upper_case.sh
username: "Scott"
password: "@T!ger"
ezconnect: 10.89.251.205:1521/esmd
USER is "Scott" 29-01-2018 11:55 Test passed

答案 1 :(得分:1)

我假设您发出此声明以更改用户的密码:

alter user johnF identified by "!p@ssword";  

因为

alter user johnF identified by !p@ssword;  

不符合oracle密码定义规则。

然后它就足以在您的文件中编写这样的脚本来连接您的架构:

#!/bin/bash
# cnn.sh
line '"!p@ssword"'
echo line
sqlplus johnF/$line@127.0.0.1:1521/yourSID

并从提示符调用:

$ . cnn.sh

答案 2 :(得分:0)

我在这里也遇到了同样的问题(这确实使我发疯了),这就是我的答案。

Oracle允许的所有特殊字符都可以在此页面上找到: https://docs.oracle.com/cd/E11223_01/doc.910/e11197/app_special_char.htm#MCMAD416

  1. 如果您的Oracle密码包含上一页中的任何特殊字符,但单引号除外。 #o @%+!$(){} [] / ^ ?:`〜例如。

您可以像这样使用它:

sh test.sh oracle_user '"#o@%+!$(){}[]/\^?:`~"' ip port service_name
  1. 如果您的Oracle密码包含单引号。 #o @%+!$(){} [] / ^ ?:`〜'。

您可以像这样使用它:

sh test.sh oracle_user '"#o@%+!$(){}[]/\^?:`~'"'"'"' ip port service_name

请注意,单引号'应该替换为'“”'。