使用 PHP 啟用 shell 腳本以不同使用者身份執行
我的 web 根目錄中有名為 copy.sh 的 shell 腳本,上面有以下幾行
rsync -rzv -e 'ssh -p 199' test.txt testuser@192.168.1.79:/home/testuser/txt ssh testuser@192.168.1.79 -p 199 . /home/testuser/lty.sh > ltylog.txt 2>&1
該腳本首先將文本文件複製到我的遠端伺服器並執行 shell 腳本以在其他兩台伺服器之間同步該文件。我在目前伺服器中為 testuser 生成 ssh 公鑰/私鑰並複製到遠端伺服器。我可以在沒有任何密碼的情況下 ssh 到遠端伺服器
ssh testuser@192.168.1.79 -p 199
我可以執行上面的命令並且可以進入我的遠端伺服器。在我的主機中,當我在 testuser 中時,我可以毫無問題地執行該 shell 腳本。它複製文件並執行遠端腳本。我現在將我的腳本權限設置為 777。但是我需要像這樣執行 shell_exec 來使用 PHP 執行這個腳本
<?php shell_exec('. /var/www/html/copy.sh'); echo "<pre>"; echo file_get_contents("ltylog.txt"); echo "<pre>"; ?>
但是當我執行這個 PHP 時,什麼也沒有發生。因為我認為執行 shell 腳本的使用者是 Apache 使用者而不是測試使用者。但是當我 shell_exec PWD 或它執行完美的東西時,而不是執行 shell 腳本。我禁用了 php 安全模式並為所有文件授予 777 權限。但我仍然無法完成這項工作。
PS 我知道將 shell 腳本放在具有權限的 Web 根目錄上存在很大的安全風險。但這不是產品系統,我正在為我們的內部目的測試小型 Web 應用程序。我執行此操作的伺服器根本無法訪問網際網路。有人可以幫我解決這個問題。我正在尋找小解決方案。因為這個小型網路應用程序僅由一兩個人使用。謝謝
如果我正確理解了您的問題並且您不關心安全風險,您可以安裝 sudo,將“www-data”(www-data 是 nginx/apache 使用的預設使用者)添加到 sudoers 文件中,具有所有權限並且沒有需要密碼並使用它以另一個使用者身份執行命令。
你可以這樣做:
安裝須藤:
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');
@編輯
我已經設法讓它在我的伺服器上工作。只需按照這些步驟操作,它也應該對您有用。
- 嘗試用以下程式碼替換您的 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>"; ?>
- 然後確保 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
但是如果您選擇使用第二個選項,請確保 www-data 仍然可以通過應用 chmod 來執行文件,如下所示:
chmod 755 /var/www/html/copy.sh
- 使文件可執行:
chmod +x /var/www/html/copy.sh
- 將 copy.sh 程式碼更改為:
rsync -rzv -e 'ssh -p 199' test.txt testuser@192.168.1.79:/home/testuser/txt ssh testuser@192.168.1.79 -p 199 /bin/sh /home/testuser/lty.sh > ltylog.txt 2>&1
- 最後,確保 testuser 有權訪問以下文件:
- /家/
- /home/testuser/
- /home/testuser/lty.sh
- /home/testuser/ltylog.txt
如果您不關心安全性,您只需在遠端伺服器的控制台中鍵入即可
chmod 777 -R /home/
或者您可以手動檢查每個文件以確保權限設置正確。