问题描述
问题:我想为 oracle 数据库创建用户。为此,我创建了 shell 脚本,它会要求输入用户名和密码。然后这些变量将存储在 sql 查询中以获取输出。请找到以下命令:
**这里的密码是纯文本的。请告诉如何加密和解密输入表单中给出的密码。 ? **
echo -n "输入新密码"
读取密码
output=`sqlplus -s '/as sysdba'
创建由“$PASSWORD”标识的用户“$USERNAME”
默认表空间“$DETAB”
临时表空间温度
配置文件默认
账户解锁;
出口;
EOF`**
解决方法
从安全角度来看,您对 shell 变量的使用通常是一个问题。一旦您将密码存储在 shell 变量中,系统上的其他用户就可以读取它。更好的方法是提示用户输入作为 SQL 脚本的一部分,而不是在 shell 中:
create_user.sql:
-- get username
accept username char prompt 'Enter user to be created > ';
-- get password and hide value from screen
accept password char prompt 'Enter password > ' HIDE;
-- get default tablespace
accept detab char prompt 'Enter default tablespace > ';
set echo off;
CREATE USER &&username IDENTIFIED BY &&password
DEFAULT TABLESPACE &&detab
TEMPORARY TABLESPACE TEMP
PROFILE DEFAULT
ACCOUNT UNLOCK;
exit;
然后像这样运行脚本:
sqlplus / as sysdba @create_user.sql
该脚本现在可以运行,而无需将密码值暴露给 shell,也不会被回显到屏幕上。
我以前写过关于这些类型的问题。请参阅此处了解更多信息:https://pmdba.wordpress.com/2020/01/13/how-to-hide-oracle-passwords-in-a-script/
,正如评论中所建议的,这里是修改后的脚本
echo -n "Enter user to be created"
read USERNAME
echo -n "Enter new password"
read PASSWORD
output=`sqlplus -s '/nolog' >/dev/null 2>/dev/null <<EOF
WHENEVER SQLERROR EXIT SQL.SQLCODE
connect / as sysdba
CREATE USER "$USERNAME" IDENTIFIED BY "$PASSWORD"
DEFAULT TABLESPACE "$DETAB"
TEMPORARY TABLESPACE TEMP
PROFILE DEFAULT
ACCOUNT UNLOCK;
exit;
EOF`
success=`echo $? `
unset PASSWORD
echo $USERNAME
echo $success
echo $output
echo $PASSWORD
如果 $success
返回 0,一切正常。如果不是有错误。
但是 $output
和 $PASSWORD
在执行结束时为空
出于调试目的,不要重定向到 /dev/null 但您会看到密码。
密码已加密存储在 Oracle 内部,正如其他帮助您的人在评论中所述
其他建议 我认为更好的解决方案是强制用户在第一次/下次登录时更改密码
例如创建用户:
- 选项
by a password expire
- 一个虚拟密码和
password expire
选项 - 使用命令
alter user $USERNAME password expire;
使密码过期。
通过这样做,Oracle 将要求用户在第一次或下一次连接时更新他的密码。密码问题将由sqlplus直接(或其他工具)管理。
您可以在脚本中添加
conn $USENAME/<dummypwd>
和 sqlplus 会提示输入新密码