我有一个 perl 脚本dhcpmanip.pl
,其中包含这一行:
system "hostapd /etc/hostapd-1.0/hostapd/hostapd.conf"`
这是一个启动命令hostapd
,我收到此错误:
Insecure `$ENV{PATH}` while running setuid at `/var/www/cgi-bin/dhcpmanip.pl` line 46
在网上搜索后,我意识到我应该向 www-data 用户(apache 用户)授予 root 权限,然后我尝试/etc/sudoers
通过插入以下行来修改文件:
www-data ALL=NOPASSWD: /var/www/cgi-bin/dhcpmanip.pl
但它仍然不起作用...有人知道如何解决这个问题吗?
答案1
您收到该消息是因为 perl 正在运行污染模式。要么你明确地设置了它(好的),要么 perl 将其打开,因为你所做的事情是危险的(坏的,但 perl 仍然做得很好)。
PATH
无论哪种方式,perl 都要求您在执行外部命令之前清理您的代码。
在执行任何外部命令之前,您需要$ENV{PATH}
在脚本中的某个位置显式设置。
为了获得良好的实践,您还应该明确使用完整路径您正在运行的任何外部命令。
答案2
根据 hostapd 的实际放置位置,您需要将 $ENV{PATH} 设置为某项。例如,如果它在/usr/bin
集合中$ENV{PATH} = "/usr/bin"
并且它应该起作用。
答案3
据我了解,您希望能够访问计算机上的特定网页,这将使计算机运行一个脚本来操纵您的 dhcp 设置。正如 SaveTheRbtz 所说,这是不是安全的方法。
当您运行 Web 服务器时,您需要确保 Web 服务器运行的任何脚本在您的服务器上执行操作的访问权限非常有限。否则,脚本中的任何小错误都可能导致某些脚本小子侵入您的服务器并滥用它。
因此,如果您有一个需要 root 访问权限的脚本,该脚本应该不是由网络服务器用户运行。我会使用更复杂的设置:
- 创建一个仅将条目写入文件的 CGI 脚本。这需要最少的权限,并且正确完成(即通过覆盖以前的条目而不是添加到它),如果有人多次点击它,甚至不会冒填满磁盘的风险。
- 创建一个 cron 作业来定期检查该文件以查看它是否已更改。如果是这样,请运行该脚本。 cron 作业可以由 root 拥有和运行,因此不需要额外的 sudo 设置。
这样,Web 服务器用户与需要 root 访问权限的脚本执行的操作完全隔离。