无法在 PHP 页面创建的 shell 脚本中执行 sqlplus 命令

Posted

技术标签:

【中文标题】无法在 PHP 页面创建的 shell 脚本中执行 sqlplus 命令【英文标题】:Can't execute sqlplus commands in shell script created by PHP page 【发布时间】: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,它也不会执行这部分,我认为它不需要sudosu 来root,所以我做错了什么?在此过程中还可能缺少哪些权限? 更新 3 使用安装了 Oracle 的“管理员”帐户直接从终端执行脚本,同时在 PHP 中获取当前用户表明它是“管理员”。 所以问题在于如何从我的 PHP 页面执行任何与操作系统无关的命令(除了 echo、ls .. 等)?

【问题讨论】:

第一行执行了吗?例如添加 touch myfile 并查看它是否存在。这可能是您脚本的权限问题。检查正在执行的用户是否存在 sqlplus 的路径。可能是它正在登录一个新的 shell 并且需要配置环境。 是的,它在浏览器上回显“1”。首先,我认为这是权限,但 .sh 被执行,也许它与 sqlplus 权限问题有关(可能不是以管理员或 root 身份登录)。我尝试了另一件事并更新了我的问题。 第二部分呢?环境变量是否设置正确?例如impdp 是可识别的可执行文件吗?你的用户名真的有 $ 吗?还是你想用这个代替?又是 $1 被传递/设置了吗? -第二部分没有执行,但第一部分执行,它与我通过 PHP 传递的参数相呼应。 -我在具有相同环境变量的同一台机器上运行所有内容。 -impdp 是可识别的,因为当我通过终端运行相同的 .sh 文件并将值传递给它(./myfile.sh 1)时,它可以正确执行。 -用户名中没有$,但我传递了一个参数,所以它会绑定。 是的,但是您的 php 脚本是否以您正在运行这些测试的同一用户身份登录? 【参考方案1】:

所以在搜索权限之后,我发现可以通过编辑 sudoers 文件来执行任何东西(root 或非 root 命令),这将允许任何 php 执行任何命令,据我所知,这是一个非常糟糕的解决方案。 参考:How to call shell script from php that requires SUDO?

【讨论】:

【参考方案2】:

确保您已设置所需的环境变量。

特别是您可能必须将LD_LIBRARY_PATH 设置为Oracle 安装附带的共享库的位置。

PHP 代码可能隐藏了与此相关的错误消息。

比较您在运行oraenv 之前和之后通常运行 SQL*Plus 或 IMP 的环境,您至少需要设置其中的一些(如果不是全部,也可能是大多数)。

【讨论】:

以上是关于无法在 PHP 页面创建的 shell 脚本中执行 sqlplus 命令的主要内容,如果未能解决你的问题,请参考以下文章

如何通过php页面执行shell脚本?

php如何执行shell脚本

PHP 使用curl 执行远程服务器的一个shell脚本

无法从 bash shell 脚本执行 Tcl 脚本

php脚本等待shell脚本执行完成

notepad编写的脚本在shell下无法运行