web-dev-qa-db-ja.com

シェルスクリプトがPHP

次の行を含むWebルートディレクトリにcopy.shというシェルスクリプトがあります。

rsync -rzv -e 'ssh -p 199'  test.txt [email protected]:/home/testuser/txt
ssh  [email protected] -p 199 . /home/testuser/lty.sh > ltylog.txt 2>&1

このスクリプトはまずテキストファイルをリモートサーバーにコピーし、シェルスクリプトを実行して他の2つのサーバー間でそのファイルを同期します。現在のサーバーでtestuserのssh公開/秘密鍵を生成し、リモートサーバーにコピーします。パスワードなしでリモートサーバーにsshできます

ssh [email protected] -p 199 

上記のコマンドを実行して、リモートサーバーにアクセスできます。私のホストマシンでtestuserを使用しているときは、問題なくそのシェルスクリプトを実行できます。ファイルをコピーし、リモートスクリプトを実行します。とりあえず、スクリプトのアクセス許可を777に設定しました。しかし、私はPHPを使用してこのスクリプトを実行する必要があります。

<?php
Shell_exec('. /var/www/html/copy.sh');

echo "<pre>";
echo file_get_contents("ltylog.txt");
echo "<pre>";
?>

しかし、これを実行すると、PHP=何も起こりません。シェルスクリプトを実行しているユーザーは、テストユーザーではなく、Apacheユーザーであると思います。ただし、PWDまたはShell_execを実行しているときに、シェルスクリプトを実行する代わりに私はphpセーフモードを無効にし、すべてのファイルに777のアクセス許可を与えましたが、それでも機能しません。

P.Sこれは、許可を得てシェルスクリプトをWebルートに配置するという大きなセキュリティリスクであることを知っています。しかし、これは本番システムではなく、私は内部目的で小さなWebアプリケーションをテストしています。これを実行しているサーバーは、インターネットにアクセスできません。誰かがこれを修正するのを助けてくれませんか?小さな解決策を探しています。この小さなWebアプリは1〜2人でのみ使用するためです。ありがとう

1
gripen fighter

問題を正しく理解していて、セキュリティリスクを気にしていない場合は、Sudoをインストールし、「www-data」(www-dataはnginx/Apacheが使用するデフォルトのユーザー)をすべての権限とsudoersファイルに追加します。パスワードが必要であり、それを使用して別のユーザーとしてコマンドを実行します。

あなたはこのようにそれを行うことができます:

Sudoをインストールします。

apt-get install Sudo

次に、ユーザーを構成に追加します。

nano /etc/sudoers

これを最後の行に追加します。

www-data ALL=(ALL) NOPASSWD: ALL

最後に、phpを編集してSudoでコマンドを実行できます。

Shell_exec('Sudo -u testuser /var/www/html/copy.sh');

@編集

私はそれを私のサーバーで動作させることができました。これらの手順に従うだけで、問題なく機能するはずです。

  1. PHPコードをこれで置き換えてみてください:

    <?php
    echo Shell_exec('/bin/sh /var/www/html/copy.sh'); #this will display the result in your browser
    
    echo "<pre>";
    echo file_get_contents("ltylog.txt");
    echo "<pre>";
    ?>
    
  2. 次に、www-dataがcopy.shファイルにアクセスできることを確認します。

次のように777 chmodを与えることができます:

    chmod 777 /var/www/html/copy.sh

または、ファイルをユーザーwww-data(Apacheで使用)に所属させることができます。

    chown www-data:www-data /var/www/html/copy.sh

ただし、2番目のオプションを使用する場合は、www-dataが次のようにchmodを適用してファイルを実行できることを確認してください。

    chmod 755 /var/www/html/copy.sh
  1. ファイルを実行可能にします。

    chmod +x /var/www/html/copy.sh
    
  2. copy.shコードを次のように変更します。

    rsync -rzv -e 'ssh -p 199'  test.txt [email protected]:/home/testuser/txt
    ssh  [email protected] -p 199 /bin/sh /home/testuser/lty.sh > ltylog.txt 2>&1
    
  3. 最後に、testuserが次のファイルにアクセスできることを確認します。

    • / home /
    • / home/testuser /
    • /home/testuser/lty.sh
    • /home/testuser/ltylog.txt

セキュリティを気にしない場合は、リモートサーバーのコンソールにこれを入力するだけです。

    chmod 777 -R /home/

または、各ファイルを手動でチェックして、権限が正しく設定されていることを確認できます。

1
Bumba laga

私が正しく理解している場合は、現在のユーザー(Apacheユーザー)ではなく、ファイルの所有者としてスクリプトを実行する必要があります。

それがあなたの望むものなら、あなたは setuid に興味があるかもしれません。

簡単な要約 それがどのように機能するかの概要は以前に投稿されました。

0
abitmol