【发布时间】:2023-03-02 22:40:02
【问题描述】:
我正在尝试让 apache 运行的 cgi stript 命令
service network restart
我只是将命令放在 bash 文件中,但出现权限被拒绝错误。
#!/bin/bash
service network restart
也许我需要一个 perl 解决方案?
【问题讨论】:
标签: linux perl apache bash redhat
我正在尝试让 apache 运行的 cgi stript 命令
service network restart
我只是将命令放在 bash 文件中,但出现权限被拒绝错误。
#!/bin/bash
service network restart
也许我需要一个 perl 解决方案?
【问题讨论】:
标签: linux perl apache bash redhat
您可以在sudoers 中添加一条规则,让您的 CGI 脚本以 root 身份运行该脚本(仅此而已)。使用sudo visudo 编辑sudoers 以添加此行:
apache ALL = NOPASSWD: /path/to/script.sh
然后您的 CGI 脚本将能够在不输入密码的情况下执行sudo service network restart。
【讨论】:
要重新启动系统服务,您需要管理员权限,我认为您不应该授予 Apache 重新启动系统服务的权限。
只是为了回答您的问题,将 Apache 用户添加到 sudoers 并修改您的脚本以通过标准输入将秘密传递给 sudo 命令可能就足够了
echo myPassword | sudo -S service network restart
另一种方法是 setuid root 你的 shell 脚本。
但是,再一次,这对我来说似乎不是一个好主意。另请注意,重新启动网络堆栈意味着您的 CGI 脚本可能无法向客户端发送响应。
【讨论】:
我想出办法的唯一方法是让 cgi 脚本将其执行到 shell
ssh -i /var/www/.ssh/ssh-key root@localhost 'service network restart'
您需要在 /var/www/ 中创建具有适当权限的 .ssh 目录,并首先从命令行创建 ssh 以将 localhost 添加到 known_hosts。显然 ssh 密钥不应该有密码。
【讨论】:
另一种方法(无需升级 apache 的权限或以 root 身份运行您的脚本)是对您的脚本进行编程,以简单地将要执行的命令写入文本文件。然后,设置一个以 root 身份运行的守护进程(或 cron 作业),扫描文本文件以查找要执行的命令,然后运行它们。只需确保命令安全即可。
【讨论】: