【问题标题】:Execute a python script from web browser从网络浏览器执行 python 脚本
【发布时间】:2019-12-02 09:16:50
【问题描述】:

我有一个在 squid 上运行的 Linux 代理服务器 (RaspberryPi-3)。我想使用网页上的 HTML 按钮启动 squid 服务。使用这个按钮,我正在尝试执行一个 python 程序来启动 squid 服务:

#!/usr/bin/env python
import os
os.system ("sudo service squid restart")

但是从网页上看,它不起作用。

从浏览器打开我的 squid 的其他选项是什么?

【问题讨论】:

  • 我已获得执行python脚本'$sudo chmod +x var/www/html/script.py'的权限

标签: php python proxy squid


【解决方案1】:

您添加了 PHP 标记,所以我假设您实际上使用 PHP 作为您的 Web 脚本语言。

不需要Python,直接从PHP执行命令即可

首先您需要启用www-data 用户以在没有sudo 的情况下运行命令。

sudo visudo  # you edit the /etc/sudoers with this program

将以下行添加到文件中,然后保存。

www-data ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart squid

如果设置了正确的权限,这在 PHP 端应该相当简单:

<?php

shell_exec ("service squid restart")

shell_exec 参考:https://www.php.net/manual/en/function.shell-exec.php

【讨论】:

【解决方案2】:
# Importing flask module in the project is mandatory 
# An object of Flask class is our WSGI application. 
from flask import Flask 

# Flask constructor takes the name of 
# current module (__name__) as argument. 
app = Flask(__name__) 

# The route() function of the Flask class is a decorator, 
# which tells the application which URL should call 
# the associated function. 
@app.route('/') 
# ‘/’ URL is bound with hello_world() function. 
def start_squid():
    import os
    os.system ("sudo service squid restart")
    return 'Success'

# main driver function 
if __name__ == '__main__': 

    # run() method of Flask class runs the application 
    # on the local development server. 
    app.run() 

如上写一个简单的 Flask api。 在您的 Html 按钮上对该烧瓶 url 进行 get/post ajax 调用,以便烧瓶控制器启动您的 squid。

在控制器中也处理异常

【讨论】:

  • 他用的是PHP,想调用一个python脚本,这个问题完全没必要引入额外的复杂性。
【解决方案3】:

您可以通过使用子流程来实现结果。

import subprocess

subprocess.call(['sudo', 'squid', 'restart'])

但是当我们使用 sub-process with sudo 命令时,意味着它可能会要求输入密码来执行命令。

【讨论】:

    猜你喜欢
    • 2020-02-18
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 2019-05-24
    • 1970-01-01
    • 2013-02-07
    相关资源
    最近更新 更多