簡體   English   中英

如何在 PHP 中執行 shell 腳本?

[英]How to execute a shell script in PHP?

我在/var/www/myscript.sh中有一個腳本,它創建文件夾並為我的項目運行命令svn update 我需要通過在瀏覽器的 PHP 文件中調用它來執行這個腳本(即Localhost/test.php )。 我嘗試使用函數shell_exec()exec()但它們不起作用。 我使用su www-data &&./myscript.sh在終端中運行了我的 shell 腳本,它工作正常。 我還缺少什么?

<?php
$output = shell_exec("./myscript.sh");
?>

2011 年 5 月 4 日更新:

我將www-data ALL=(ALL) NOPASSWD:ALL添加到 /etc/sudoers 並且它可以工作,但這非常不安全。 還有另一種方法可以做到這一點嗎?

幾種可能:

  • 您已啟用安全模式。 這樣,只有exec()工作,然后只在safe_mode_exec_dir中的可執行文件上工作
  • execshell_exec在 php.ini 中被禁用
  • 可執行文件的路徑錯誤。 如果腳本與 php 文件在同一目錄下,請嘗試exec(dirname(__FILE__). '/myscript.sh');

您可能禁用了 exec 權限,大多數 LAMP 包都禁用了這些權限。 檢查您的 php.ini 是否有此行:

disable_functions = exec

並刪除 exec、shell_exec 條目(如果有)。

祝你好運!

Residuum 確實為您應該如何讓 shell exec 找到您的腳本提供了正確的答案,但在安全性方面,有幾點。

我想您不希望您的 shell 腳本位於您的 web 根目錄中,因為任何擁有 web 訪問您服務器的人都可以看到它。

我建議將 shell 腳本移到 webroot 之外

    <?php
      $tempFolder = '/tmp';
      $webRootFolder = '/var/www';
      $scriptName = 'myscript.sh';
      $moveCommand = "mv $webRootFolder/$scriptName $tempFolder/$scriptName";
      $output = shell_exec($moveCommand);
    ?>

關於:

我添加 www-data ALL=(ALL) NOPASSWD:ALL 到 /etc/sudoers 作品

您可以將其修改為僅涵蓋腳本中需要 sudo 的特定命令。 否則,如果您的 sh 腳本中的任何命令都不需要 sudo 執行,那么您根本不需要執行此操作。

嘗試以 apache 用戶身份運行該腳本(使用 su 命令切換到 apache 用戶),如果沒有提示您輸入 sudo 或授予權限被拒絕等,那就沒問題了。

IE:

sudo su apache (or www-data)
cd /var/www
sh ./myscript

另外......讓我來到這里的是我想使用動態生成的命令運行多行 shell 腳本。 我希望我的所有命令都在同一個 shell 中運行,這不會在多次調用 shell_exec() 時發生。 對此的答案是像 Jenkins 那樣做 - 創建動態生成的多行命令,將其放入變量中,將其保存到臨時文件夾中的文件中,執行該文件(使用 shell_exec in() php as Z2ADAE54334C0A5CE2ABE3E5is Java),然后用 output 做任何你想做的事,並刪除臨時文件

...瞧

如果您有一個需要運行的小腳本(我只需要復制一個文件),我發現通過調用來調用 PHP 腳本上的命令要容易得多

exec("sudo cp /tmp/testfile1 /var/www/html/testfile2");

並通過首先調用sudo visudo並將以下行添加到 sudoers 的最后一行來編輯(或者更確切地說添加)允許行來啟用此類事務

www-data ALL=(ALL) NOPASSWD:/bin/cp /tmp/testfile1 /var/www/html/testfile2

我想做的就是復制一個文件,但由於 root 密碼問題,我一直遇到問題,正如你提到的,我不想讓系統公開所有 root 事務都沒有密碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM