2017-10-19 5 views
2

現在、さまざまなシェルスクリプトを実行して、Webサイトの生成と削除時のクリーンアップを処理するPHP Webアプリケーションを作成しようとしています。Phpseclib SSH2がシェルスクリプトを実行していない

$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は私のスクリプトのオプション/パラメータです:

は、ここに私のdeletePropertyProcess.phpからの抜粋です。

楽しい部分は、このすべてが完璧にパテを介して動作します。 PHPからAjaxを介してこの機能を実行すると、シェルスクリプトの終了ステータスとAjaxからの予想される出力が返されますが、実際にシェルスクリプトで処理された変更は適用されません。

私が言ったように、これは私は問題はシェルスクリプトである疑いが、ここで、それはとにかくあるパテから完璧に動作します:

#!/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 

この時点で、すべての推奨は有用であろう。これ以上の情報が必要な場合はお知らせください。私はそれが以下のものを使用して、シェルスクリプトのフルパスに--stdinを経由してsudoのパスワードを供給することにより、作業を取得するために管理してきました

+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スクリプトを見ると、ちょうど値をエコーし​​ていることがわかります。簡潔でシンプル。"Funの部分は、すべてがパテで完璧に動作します。PHPからAjax経由でこの機能を実行すると、シェルスクリプトの終了ステータスとAjaxからの予想される出力が返されますが、 " 意味正しい出力値がシェルスクリプト(つまり0)によって返されますが、リモートサーバの変更には影響しません。それはすべてそこにあります... –

答えて

0

$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シェルスクリプトを実行します。

+0

この問題は、スクリプトの出力にsudoプロンプトのテキストが含まれていることがある...これを抑制する方法がわからない。奇妙なことに、一部のスクリプトでのみ発生します。 –

関連する問題