使用ssh2_exec远程执行sh脚本时,PHP无法正常工作

时间:2013-07-30 10:20:51

标签: php shell ssh sh

我有一个shell脚本makedir.sh,如下所示。

sudo -H sh -c '
    mkdir /usr/local/testdir;
    if [ $? -eq 0 ];then
        echo "Successfull";
    else
        echo "Unsuccessfull";
    fi
'

我已经授权用户testuser使用sudo执行shell脚本,但没有询问密码。为此,我在/etc/sudoers文件中添加以下行,

testuser ALL=(ALL) NOPASSWD: ALL

它运行正常,我可以使用sudo运行命令,但不需要密码。上面的shell脚本也可以正常工作而不需要密码,在testdir内创建目录/usr/local。我的问题从这里开始。我想从php文件运行此shell脚本。在当前场景中,shell脚本驻留在ip地址为10.3.2.0的远程机器中。以下是我的php代码,但在运行此PHP代码时,它不会在/usr/local/内创建任何目录(testdir)。请告知我PHP中的初学者。

PHP代码

<?php
if (!function_exists("ssh2_connect")) die("function ssh2_connect doesn't exist");
if(!($con = ssh2_connect("10.3.2.0", "22")))
{
    echo "fail: unable to establish connection";
}
else
{
    if(!ssh2_auth_password($con, "testuser", "abcdef"))
    {
        echo "fail: unable to authenticate ";
    }
    else
    {
        $stream = ssh2_exec($con, "./makedir.sh");
            stream_set_blocking($stream, true);
        $item = "";
        while ($input = fread($stream,4096)) {
               $item .= $input;
        }
        echo $item;
    }
}

?>

SHELL SCRIPT - makedir.sh(驻留在10.3.2.0 - 与上面相同的shell脚本)

#!/bin/sh
sudo -H sh -c '
    mkdir /usr/local/testdir;
    if [ $? -eq 0 ];then
        echo "Successfull";
    else
        echo "Unsuccessfull";
    fi
'

感谢。

2 个答案:

答案 0 :(得分:0)

据我所知,sudo命令不适用于php的ssh2模块。您需要以具有该目录权限的用户身份进行连接。

答案 1 :(得分:0)

嗯......问题是一年前xD但我仍然可能会停下来 使用sudo与ssh2_exec你需要一个小技巧。这是不安全的,不推荐,但如果你别无选择,可以使用

ssh2_exec($connection, "echo sudopw | yourscript.sh" . PHP_EOL);

并且您的脚本必须使用参数-S

调用sudo
"sudo -S mkdir folder"

应该有效