运行 python 脚本在 php 脚本中使用 shell_exec() 导致权限被拒绝错误
Running python script with shell_exec() in php script results in permission denied error
我通过 SSH 连接到我的 OracleLinux 服务器。服务器是 运行 正在运行的 apache 网络服务器,也是 php。 Python3 也已安装。
现在我正在尝试通过 JavaScript AJAX 请求 运行 一个 php 脚本,进而 运行 一个 Python用它编写脚本。
目录结构:
/var/www/website/webwatcher
--index.html
--js/
-----script.js (run PHP script from here with AJAX request)
--php/
-----getWebsiteElementValue.php (run webscraper.py from here)
--python/
-----webscraper.py
script.js
:
window.onload = () => {
getWebsiteElementValue((data) => {
console.log(data);
});
}
function getWebsiteElementValue(success) {
let ajax = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
let ajaxURL = '/webwatcher/php/getWebsiteElementValue.php';
ajax.open('post', ajaxURL);
ajax.onreadystatechange = () => {
if (ajax.readyState > 3 && ajax.status == 200) {
success(ajax.responseText);
}
}
ajax.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
ajax.send();
}
getWebsiteElementValue.php
:
<?php
$output = shell_exec('/usr/bin/python3 /var/www/website/webwatcher/python/webscraper.py 2>&1');
echo $output;
?>
webscraper.py
:
from bs4 import BeautifulSoup
from urllib.request import urlopen
from sys import argv
import ssl
url = 'https://buyzero.de/products/raspberry-pi-4-model-b-8gb?variant=31817426698342';
cssSelector = 'div.product-form__info-list > div:nth-child(2) > div > span';
context = ssl._create_unverified_context();
page = urlopen(url, context=context);
html = page.read().decode("utf-8");
soup = BeautifulSoup(html, "html.parser");
elementText = soup.select(cssSelector)[0].text;
print(elementText);
当我通过终端 运行 python 脚本时,它 returns 没有错误地得到了想要的输出。
但是,当通过 shell_exec() php 命令发生相同情况时,我在网站的控制台中收到以下错误消息(已缩短):
PermissionError: [Errno 13] Permission denied
和
urllib.error.URLError: <urlopen error [Errno 13] Permission denied>
/var/www
文件夹都具有以下权限 drwxr-xr-x.
并且属于 root:root
。
website/
的目录结构到文件webscraper.py
(以及里面的所有子文件夹和文件)都属于apache:apache
,分别有drwxrwxr-x.
和-rwxrwxr-x.
的权限.
现在哪里出错了?
@MaciejWrobel 的评论让我找到了问题的解决方案。
因为Linux系统的httpd_can_network_connect
布尔值默认设置为off
,它似乎阻止访问Python中的各种Python模块=] 脚本并以上述错误结束。 运行 终端中的命令 setsebool -P httpd_can_network_connect on
解决了我的问题。
我通过 SSH 连接到我的 OracleLinux 服务器。服务器是 运行 正在运行的 apache 网络服务器,也是 php。 Python3 也已安装。
现在我正在尝试通过 JavaScript AJAX 请求 运行 一个 php 脚本,进而 运行 一个 Python用它编写脚本。
目录结构:
/var/www/website/webwatcher
--index.html
--js/
-----script.js (run PHP script from here with AJAX request)
--php/
-----getWebsiteElementValue.php (run webscraper.py from here)
--python/
-----webscraper.py
script.js
:
window.onload = () => {
getWebsiteElementValue((data) => {
console.log(data);
});
}
function getWebsiteElementValue(success) {
let ajax = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
let ajaxURL = '/webwatcher/php/getWebsiteElementValue.php';
ajax.open('post', ajaxURL);
ajax.onreadystatechange = () => {
if (ajax.readyState > 3 && ajax.status == 200) {
success(ajax.responseText);
}
}
ajax.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
ajax.send();
}
getWebsiteElementValue.php
:
<?php
$output = shell_exec('/usr/bin/python3 /var/www/website/webwatcher/python/webscraper.py 2>&1');
echo $output;
?>
webscraper.py
:
from bs4 import BeautifulSoup
from urllib.request import urlopen
from sys import argv
import ssl
url = 'https://buyzero.de/products/raspberry-pi-4-model-b-8gb?variant=31817426698342';
cssSelector = 'div.product-form__info-list > div:nth-child(2) > div > span';
context = ssl._create_unverified_context();
page = urlopen(url, context=context);
html = page.read().decode("utf-8");
soup = BeautifulSoup(html, "html.parser");
elementText = soup.select(cssSelector)[0].text;
print(elementText);
当我通过终端 运行 python 脚本时,它 returns 没有错误地得到了想要的输出。
但是,当通过 shell_exec() php 命令发生相同情况时,我在网站的控制台中收到以下错误消息(已缩短):
PermissionError: [Errno 13] Permission denied
和
urllib.error.URLError: <urlopen error [Errno 13] Permission denied>
/var/www
文件夹都具有以下权限 drwxr-xr-x.
并且属于 root:root
。
website/
的目录结构到文件webscraper.py
(以及里面的所有子文件夹和文件)都属于apache:apache
,分别有drwxrwxr-x.
和-rwxrwxr-x.
的权限.
现在哪里出错了?
@MaciejWrobel 的评论让我找到了问题的解决方案。
因为Linux系统的httpd_can_network_connect
布尔值默认设置为off
,它似乎阻止访问Python中的各种Python模块=] 脚本并以上述错误结束。 运行 终端中的命令 setsebool -P httpd_can_network_connect on
解决了我的问题。