首頁>Program>source

我想从PHP指令碼執行系統上存在的Bash指令碼.我的系統上有两个指令碼.其中之一是一个名為 client.php的PHP指令碼 出現在 /var/www/html 另一个是稱為 testscript的Bash指令碼 出現在 /home/testuser .

我的client.php指令碼看起来像

<?php
  $message=shell_exec("/home/testuser/testscript 2>&1");
  print_r($message);
?> 

我的測試指令碼看起来像

#!/bin/bash
echo "Testscript run succesful"

当我在终端上執行以下操作

php client.php

我在终端上得到以下輸出

Testscript run successful

但是当我在

處打開頁面時
http://serverdomain/client.php

我得到以下輸出

sh: /home/testuser/testscript: Permission denied

即使執行了chmod + x testscript,我仍然收到此錯誤。
我如何从瀏覽器中使用它? 請帮忙。

最新回復
  • 5月前
    1 #

    我將在www檔案夹下的某个目錄下有一个名為scripts的目錄,這樣它就不能从web上訪問,但是可以通過PHP到達.

    例如 /var/www/scripts/testscript

    確保您的 testscript的使用者/組 与您的網路檔案相同.例如,如果您的 client.phpapache:apache拥有 ,使用 chown將bash指令碼更改為相同的使用者/組 .你可以找出你的 client.php 和網路檔案归 ls -al所有 .

    然後執行

    <?php
          $message=shell_exec("/var/www/scripts/testscript 2>&1");
          print_r($message);
        ?> 
    

    EDIT:

    如果您真的想从web服務器上以root使用者身份執行檔案,則可以在下面尝試使用此二进製包裝程式.簽出此解決方案以完成您想要的相同操作.

    通過PHP執行root命令

  • 5月前
    2 #

    在不真正了解設置複雜性的情况下,我類似sudo路由。 首先,您必须配置sudo以允许您的網路服務器以root身份執行给定命令.然後,您需要使web服務器shell_exec的(testscript)使用sudo執行命令的指令碼。

    For A Debian box with Apache and sudo:

    配置sudo:

      As root, run the following to edit a new/dedicated configuration file for sudo:

       
      visudo -f /etc/sudoers.d/Webserver
      

      (或任何您想在 /etc/sudoers.d/中呼叫檔案的地方 )

      將以下內容添加到檔案中:

      www-data ALL = (root) NOPASSWD: <executable_file_path>
      

      其中 <executable_file_path> 是您需要能够以root身份執行且其名稱帶有完整路徑的命令(例如 /bin/chown 用於chown可執行檔案).如果可執行檔案每次都使用相同的引數執行,則可以在可執行檔案的名稱之後添加其引數,以进一步限製其使用。

      例如,假設我们总是要複製/ root /目錄中的相同檔案,我们將編寫以下內容:

      www-data ALL = (root) NOPASSWD: /bin/cp /root/test1 /root/test2
      

      修改指令碼(測試指令碼):

      編輯您的指令碼,使得 sudo 出現在需要root特權的命令之前(例如 sudo /bin/chown ...sudo /bin/cp /root/test1 /root/test2 ).確保sudo配置檔案中指定的引數与该檔案中的可執行檔案所使用的引數完全匹配。 因此,對於上面的示例,指令碼中將包含以下內容:

      sudo /bin/cp /root/test1 /root/test2
      

      如果仍然拒绝授予權限,則指令碼檔案及其父目錄的權限可能不允许web服務器執行指令碼本身。 因此,您需要將指令碼移動到更合適的目錄和/或更改指令碼和父目錄的權限,以允许通過www-data(使用者或組)執行,這超出了本教程的範圍。

      Keep in mind:

      在配置sudo時,目的是允许以最受限製的形式使用命令.例如,仅当引數為/ root / test1 / root時,才允许使用cp命令,而不是允许一般使用cp命令 / test2.這意味着cp的引數(不能更改cp的功能)。

  • 5月前
    3 #

    這是一个簡單的問题.从终端執行時,您以特權使用者身份从终端執行php檔案.当您从web瀏覽器轉到php時,php指令碼將以web服務器使用者的身份執行,该使用者無權執行主目錄中的檔案.在Ubuntu中,www-data使用者是apache web服務器使用者.如果您使用的是ubuntu,則必须執行以下操作: 更改您的使用者名:www-data / home / testuser / testscript chmod g + x / home / testuser / testscript

    上述操作是將檔案的使用者所有權轉让给您,並為它提供web服務器組的所有權.接下来的命令授予该組可執行檔案權限.現在,下次您繼續使用瀏覽器进行操作時,它應该可以工作。

  • 5月前
    4 #

    我一直在為這一確切問题苦苦挣扎三天.我已將指令碼的權限設置為755。我一直在按如下方式呼叫指令碼.

    <?php
       $outcome = shell_exec('/tmp/clearUp.sh');
       echo $outcome;
    ?>
    

    我的指令碼如下。

    #!bin/bash
    find . -maxdepth 1 -name "search*.csv" -mmin +0 -exec rm {} \;
    

    我没有任何輸出或反馈.我為使指令碼執行而进行的更改是在指令碼內的tmp中添加了cd:

    #!bin/bash
    cd /tmp;
    find . -maxdepth 1 -name "search*.csv" -mmin +0 -exec rm {} \;
    

    運气比判斷還好,但是它現在執行良好.希望對您有所帮助。

  • r:將日期格式更改為"%d /%m /%y"
  • sql:如何防止資料庫觸發器遞迴?