[英]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");
?>
我將www-data ALL=(ALL) NOPASSWD:ALL
添加到 /etc/sudoers 並且它可以工作,但這非常不安全。 還有另一種方法可以做到這一點嗎?
幾種可能:
exec()
工作,然后只在safe_mode_exec_dir
中的可執行文件上工作exec
和shell_exec
在 php.ini 中被禁用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.