【发布时间】:2018-07-07 14:20:30
【问题描述】:
我有一个混合了 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,但它永远不会工作,返回登录被拒绝(密码错误)或连接问题(可能是 @ 被截获作为错误的目标)。
如何解决这个难题?
谢谢。
【问题讨论】:
-
可能是this?或者也许使用heredoc?
-
你可以使用sqlplus /nolog,然后在sqlplus 脚本中使用connect 语句。这应该会消除一些使问题复杂化的 shell 交互。
-
你能分享你的
alter user johnF identified by ???声明吗? -
有许多与数据库密码相关的特殊字符相关的 Oracle MOS 文章,例如 support.oracle.com/MMOS/faces/ui/km/…。有转义和使用引号的指导。
-
谢谢大家,我的密码已正确更改。而且我知道shell转义的基本知识,但是我无法应用它来在shellscript中发送特殊密码,其中中间的数据是一个变量。我相信我的脚本重现了这个问题。有什么解决办法吗?谢谢。
标签: linux bash oracle shell sqlplus