2

我创建了一个简单的 PHP 站点,我们想用它来禁用/启用 cisco 交换机上的端口。我通过 php 函数 exec() 将两个参数(端口和操作)传递给 bash 脚本。为了调试,我在 bash 脚本的最后设置了这些参数。

我调用的 php 函数的重要部分如下所示:

function PortAction($port, $action){
    echo "<hr /> Port:".$port."<br />Action:".$action;
    chdir('/usr/local/icinga-1.7.0/videowand/');
    echo exec('sh /usr/local/icinga-1.7.0/videowand/action2.sh 2>&1',$output, $return);
    echo "Return / Output: ".$return;
    print_r($output);    
}

bash 脚本“action2.sh”:

#!/bin/bash
/usr/libexec/rancid/clogin -c "conf t; int Fa0/1; shutdown" 192.168.6.6

如果我以 apache 用户身份手动执行 bash 脚本(甚至直接执行 clogin 命令),一切都会按预期工作,端口会被禁用。但是一旦我通过 PHP 函数调用它,我就会得到输出:

数组([0] => 没有这样的变量 [1] =>(读取“env(HOME)”上的跟踪)[2] => 从 [3] 内部调用 =>“设置密码文件 $env(HOME)/.cloginrc " [4] => (文件 "/usr/libexec/rancid/clogin" 第 66 行)

什么都做不成。这表明密码输入有问题(据我所知)。这个文件的权限是正确的,我猜他们必须这样做,否则它不能直接在 shell 内工作。甚至尝试使用 -f 开关更改 .cloginrc 路径,但没有成功。PHP 安全模式:关闭显示错误:打开

该脚本需要一段时间,因为需要打开 telnet 连接。这就是为什么我把它放到一个单独的 bash 脚本中。

4

1 回答 1

1

提供sh二进制文件的完整路径,如下所示:

echo exec('/bin/sh /usr/local/icinga-1.7.0/videowand/action2.sh 2>&1',$output, $return);

我在/bin/sh上面假设,因为这通常是 sh 的标准路径,但请确保使用
which sh命令。

/bin/sh/bin/bash是您exec()/bin/bashshell的软链接,通常是/bin/sh

于 2012-12-03T08:45:28.303 回答