【发布时间】:2015-12-21 13:07:18
【问题描述】:
TL;DR:
我有一个 PHP 页面,它执行包含 impdp 的 shell 脚本,该脚本将转储导入新架构。
PHP 文件:
echo shell_exec("./DumpCreator.sh 22");
DumpCreator.sh
#!/bin/bash
echo $1
impdp U_$1/Pass DIRECTORY=dmpdir DUMPFILE=MYDMP.DMP remap_schema=PARENT:U_$1
它回显 22,但 impdp 不执行,尽管所有权限都授予单个用户(管理员)。
完整
我有一个 PHP 页面,它创建一个 shell 脚本文件并将其内容覆盖如下:
$shellFile = fopen("myfile.sh" , "w");
$field = "1";
$command = "#!/bin/bash\n"
."echo $field\n"
."sqlplus system/pass as sysdba << SQLEND\n"
."create user U_$field identified by newpass;\n"
."grant dba to U_$field;\n"
."exit;\n"
."SQLEND\n";
fwrite($shellFile, $command);
$output = shell_exec("bash myfile.sh");
echo $output;
fclose($shellFile);
.sh 文件的内容
#!/bin/bash
echo 1
sqlplus system/pass sysdba << SQLEND
create user U_1 identified by pass;
grant dba to U_1;
exit;
SQLEND
我的问题是 sqlplus 的部分没有执行。
所以这有什么问题,在此先感谢。
更新
当我执行 .sh 文件本身时,一切都执行良好(添加并授予用户)。
UPDATE 2
我尝试使用 php oci 进行上述操作,并且运行成功。
现在的问题是当用户被授予权限时,我需要使用我需要使用 PHP 执行的脚本将一些转储复制到它。
我的新 .sh 文件
#!/bin/bash
echo $1
impdp U_$1/pass DIRECTORY=DATA_PUMP_DIR DUMPFILE=something.DMP remap_schema=something:U_$1
即使我删除了$1,它也不会执行这部分,我认为它不需要sudo 或su 来root,所以我做错了什么?在此过程中还可能缺少哪些权限?
更新 3
使用安装了 Oracle 的“管理员”帐户直接从终端执行脚本,同时在 PHP 中获取当前用户表明它是“管理员”。
所以问题在于如何从我的 PHP 页面执行任何与操作系统无关的命令(除了 echo、ls .. 等)?
【问题讨论】:
-
第一行执行了吗?例如添加 touch myfile 并查看它是否存在。这可能是您脚本的权限问题。检查正在执行的用户是否存在 sqlplus 的路径。可能是它正在登录一个新的 shell 并且需要配置环境。
-
是的,它在浏览器上回显“1”。首先,我认为这是权限,但 .sh 被执行,也许它与 sqlplus 权限问题有关(可能不是以管理员或 root 身份登录)。我尝试了另一件事并更新了我的问题。
-
第二部分呢?环境变量是否设置正确?例如impdp 是可识别的可执行文件吗?你的用户名真的有 $ 吗?还是你想用这个代替?又是 $1 被传递/设置了吗?
-
-第二部分没有执行,但第一部分执行,它与我通过 PHP 传递的参数相呼应。 -我在具有相同环境变量的同一台机器上运行所有内容。 -impdp 是可识别的,因为当我通过终端运行相同的 .sh 文件并将值传递给它(./myfile.sh 1)时,它可以正确执行。 -用户名中没有$,但我传递了一个参数,所以它会绑定。
-
是的,但是您的 php 脚本是否以您正在运行这些测试的同一用户身份登录?