在 Rocky Linux 9 中运行的 Apache 托管的 python Flask Web 应用程序无法执行关闭命令

问题描述 投票:0回答:1

我是 python Flask 应用程序网络托管的新手,在网络应用程序中,我尝试设置功能以在每项工作完成后关闭服务器。我已经在 Flask jinja python 虚拟环境中构建了该应用程序,并使用 apache Web 服务由 wsgi 托管。用户 apache 具有执行脚本的 root 权限,以及完整权限。

整个Rocky Linux操作系统运行在树莓派4上

问题 当我尝试使用以下选项来关闭由 apache 托管的服务时,我在 apache error_log 文件中收到以下错误。

sudo: PAM account management error: Permission denied
sudo: unable to open audit system: Permission denied
sudo: a password is required

python init.py 文件


data = 'yes'
down(data)

def down(cname = None):
    try:
        if cname == 'yes':
            print (cname)
            if os.name != 'nt':
                #os.system("sudo shutdown -h now")
                #os.system('sudo systemctl poweroff')
                #subprocess.check_output("sudo /sbin/shutdown -h now", shell=True, universal_newlines=True)
                subprocess.call(["sudo", "shutdown", "-h", "now"])
                #os.system('sudo bash [complete path to the script]/off.ksh')
                #os.system('python [complete path to the script]/test.py')
                #subprocess.run(["python", "[complete path to the script]/test.py"])

            else :
               os.system('shutdown /s')
            return

except Exception as e:
        exc_type, exc_obj, exc_tb = sys.exc_info()
        e = str(e) + str(exc_type) + str(exc_tb.tb_lineno)
        return Exception(e)
**off.ksh**
#!/bin/bash
sudo shutdown -h now
`**test.py**
import os

if os.name != 'nt':
    print(os.name)
    os.system('sudo shutdown -h now')
else :
    os.system('shutdown /s')`

请提供尽快解决此问题的想法,如果问题没有意义,请告诉我。

python-3.x apache flask wsgi rocky-os
1个回答
0
投票

你可以通过在 apache 权限中做一些令人讨厌的事情来实现这一点,但到目前为止,这是可能的。

  1. 新建一个shell脚本文件,例如shutdown_server.sh。
  2. 在脚本中添加以下内容:
#!/bin/bash

# Check if the user has sufficient privileges
if [ "$(id -u)" != "0" ]; then
    echo "This script must be run as root" 1>&2
    exit 1
fi

# Shutdown the server
shutdown -h now
  1. 给脚本授予root权限:
chmod +x shutdown_server.sh
  1. 修改 sudoers 文件:!!!风险警报!!!
www-data ALL=(ALL) NOPASSWD: /sbin/shutdown
  1. 调用API来调用此脚本
from flask import Flask, request
import subprocess

app = Flask(__name__)

@app.route('/shutdown', methods=['POST'])
def shutdown():
    subprocess.call(["/path/to/shutdown_server.sh"])
    return 'Shutting down...'

if __name__ == '__main__':
    app.run(debug=True)
© www.soinside.com 2019 - 2024. All rights reserved.