【问题标题】:Restart service from CGI Script从 CGI 脚本重新启动服务
【发布时间】:2023-03-02 22:40:02
【问题描述】:

我正在尝试让 apache 运行的 cgi stript 命令

service network restart

我只是将命令放在 bash 文件中,但出现权限被拒绝错误。

 #!/bin/bash
 service network restart

也许我需要一个 perl 解决方案?

【问题讨论】:

    标签: linux perl apache bash redhat


    【解决方案1】:

    您可以在sudoers 中添加一条规则,让您的 CGI 脚本以 root 身份运行该脚本(仅此而已)。使用sudo visudo 编辑sudoers 以添加此行:

    apache ALL = NOPASSWD: /path/to/script.sh
    

    然后您的 CGI 脚本将能够在不输入密码的情况下执行sudo service network restart

    【讨论】:

      【解决方案2】:

      要重新启动系统服务,您需要管理员权限,我认为您不应该授予 Apache 重新启动系统服务的权限。

      只是为了回答您的问题,将 Apache 用户添加到 sudoers 并修改您的脚本以通过标准输入将秘密传递给 sudo 命令可能就足够了

      echo myPassword | sudo -S service network restart
      

      另一种方法是 setuid root 你的 shell 脚本。

      但是,再一次,这对我来说似乎不是一个好主意。另请注意,重新启动网络堆栈意味着您的 CGI 脚本可能无法向客户端发送响应。

      【讨论】:

        【解决方案3】:

        我想出办法的唯一方法是让 cgi 脚本将其执行到 shell

         ssh -i /var/www/.ssh/ssh-key   root@localhost 'service network restart'
        

        您需要在 /var/www/ 中创建具有适当权限的 .ssh 目录,并首先从命令行创建 ssh 以将 localhost 添加到 known_hosts。显然 ssh 密钥不应该有密码。

        【讨论】:

          【解决方案4】:

          另一种方法(无需升级 apache 的权限或以 root 身份运行您的脚本)是对您的脚本进行编程,以简单地将要执行的命令写入文本文件。然后,设置一个以 root 身份运行的守护进程(或 cron 作业),扫描文本文件以查找要执行的命令,然后运行它们。只需确保命令安全即可。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-10-17
            • 2018-01-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-03-24
            • 2012-11-11
            • 2017-11-20
            相关资源
            最近更新 更多