Когда разрешения этого скрипта равны u=rwx,g=rwx,o=r
, скрипты работают нормально ... Тем не менее, мне нужно, чтобы бит setuid был включен, поэтому вызов smartctl возвращает вместо ошибок.Параметр не работает, когда бит setuid включен в perl cgi script
#!/usr/bin/perl
use strict;
use warnings;
use CGI qw(:standard);
my $device = param("device") || "sda";
print header("text/plain");
print "device = $device\n\n";
$ENV{"PATH"} = "/usr/sbin";
open(PS, "smartctl -A /dev/$device |");
while(<PS>)
{
print $_ . "\n";
}
close(PS);
Когда я установить разрешение на u=rwxs,g=rwxs,o=r
, скрипт работает, если запрос не указывает device
. Но тогда, когда указан device
, ничего не возвращается после print "device = $device\n\n";
'setuid' на скриптах - это зло. Не можете ли вы использовать 'sudo/usr/sbin/smartctl' в вашем скрипте? – Mat
Я полагаю, что могу попробовать, если бы я дал пользователю www-data no-password необходимые разрешения sudo для smartctl. Тем не менее, я все равно хотел бы понять, почему это не работает. –
Как 'setuid' обрабатывается для скриптов, совершенно не переносится. Он может (если я правильно помню) включать сброс среды к нормальным значениям и тому подобным. Это немного испортило бы CGI. – Mat