2017-10-19 72 views
2

当前尝试创建一个PHP Web应用程序来运行各种Shell脚本来处理网站生成和清除删除。Phpseclib SSH2不执行Shell脚本

下面是从我deletePropertyProcess.php一个片段:

$ssh = new Net_SSH2($server); 

if(!$ssh->login("username", "password")) { 
    $result['result'] = 'ERROR'; 
    $result['message'] = 'Login failed to server ' . $server; 
} else { 
    $result = $ssh->exec("cd /var/www/sites ; sudo /usr/local/bin/delete_property_folder.sh -c $comp -p $prop"); 
    echo $result; 
} 

哪里delete_property_folder.sh是我的远程服务器上的bash脚本和-c $comp -p $prop是我的脚本选项/参数。

有趣的是,所有这些都可以通过Putty完美地工作。通过Ajax从PHP运行此功能将返回Shell脚本的退出状态和Ajax的预期输出,但实际上并未应用Shell脚本处理的更改。

就像我说的,这从腻子运行完美,所以我怀疑问题是shell脚本,但在这里它是反正:

#!/bin/bash 

function fix_file_permissions() { 
    chown -Rf username:username $1/$2 

    echo $?; 
} 

function delete_specified_folder() { 
    rm -rf $1/$2 

    echo $?; 
} 

##Main Script Body 
POSITIONAL=() 
while [[ $# -gt 0 ]] 
do 
    key="$1" 

    case $key in 
     -c|--company) 
      COMPANY="$2" 
      shift 
      shift 
     ;; 
     -p|--property) 
      PROPERTY="$2" 
      shift 
      shift 
     ;; 
     *) #unknown option 
      POSITIONAL+=("$1") #save it in an array for later 
      shift 
     ;; 
    esac 
done 
set -- "${POSITIONAL[@]}" #restore positional parameters 

PERMISSIONS_FIXED=$(fix_file_permissions $COMPANY $PROPERTY) 
if [ $PERMISSIONS_FIXED -eq 0 ]; then 
    FOLDER_DELETED=$(delete_specified_folder $COMPANY $PROPERTY) 
    echo $FOLDER_DELETED 
    exit 
fi 
echo 1 

在这一点上,任何建议将是有益的。让我知道你是否需要更多信息。

+1

我设法通过使用以下命令通过--STDIN提供sudo密码来工作: '$ result = $ ssh-> exec(“cd/var/www/sites; echo password | sudo -S /usr/local/bin/delete_property_folder.sh -c $ comp -p $ prop“);' –

+0

你不说你的代码是如何失败的,或者你运行它时会发生什么。究竟发生了什么?你有没有收到任何错误信息? – Kenster

+0

对于这个例子,如果你看看Bash脚本,你会发现它只是回显一个值。干净利落。 “有趣的是,所有这些都可以通过Putty完美地工作。通过Ajax从PHP运行此功能将返回Shell脚本的退出状态以及Ajax的预期输出,但实际上并未应用Shell脚本处理的更改“。 意思是我的shell脚本(即0)返回正确的输出值,但它不影响远程服务器上的任何更改。这是所有的...... –

回答

0

我已经成功地得到它的工作通过使用进食通过--stdin sudo的密码,而shell脚本的完整路径如下:

$result = $ssh->exec("cd /var/www/sites; echo 'password' | sudo -S /usr/local/bin/delete_property_folder.sh -c $comp -p $prop"); 

echosudo -S -ing您的密码,您可以通过您的通过管道密码进入sudo shell脚本执行。

+0

问题在于,有时脚本的输出包含来自sudo提示符的文本......不知道如何抑制这一点。奇怪的是,只发生在一些脚本上。 –