2011-01-17 4 views
2

Как проверить, является ли пользователь root в PHP-скрипте? Какая команда? я пытался что-то вроде этого:Проверьте, является ли пользователь root

exec("su -l login < `echo password`"); 

но команда су не может получить пароль ...

Обратите внимание, что машина изолирована от Интернета, так что я могу запустить PHP как корень, если это необходимо.

EDIT: Я не хочу знать, является ли текущий пользователь, выполняющий сценарий, root или нет. У меня есть список пользователей в моем PHP-скрипте, и я хочу знать для каждого входа, если у него есть права root.

+1

Что именно вы пытаетесь сделать? – thkala

+0

Возможно, exec ("su -l login <". $ Password)? –

+1

Вы можете попробовать посмотреть, присутствует ли команда «whoami». – Knubo

ответ

3

Прежде всего, спросите себя, что именно определяет логин «с правами root». AFAICT существует 2 основных решения.

Путь старой школы, где sysadmins создают несколько учетных записей с uid 0, которые я - и я, конечно, не одинок в этом - считайте, что это кошмар. В этом случае вы можете проверить всех пользователей в своем списке, используя posix_getpwnam и посмотреть, соответствует ли их uid 0.

Следующий фрагмент кода делает только что $ привилегированный будет содержать пользователь с привилегиями суперпользователя:

$logins = array('root', 'john', 'guest', 'foo'); 
$privileged = array(); 
foreach($logins as $login) { 
    $userInfo = posix_getpwnam($login); 
    if ($userInfo !== FALSE) { 
     if ($userInfo['uid'] == 0) { 
      $privileged[] = $login; 
     } 
    } 
} 

Другого (и имхо только вменяемый) способом сделать это, чтобы добавить все пользователь с корнем/административным привилегии для определенной группы (wheel или admin уже используются в разных дистрибутивах Linux, выясните, какой из них работает для вас). Этот сценарий еще проще, поскольку вы можете использовать posix_getgrnam для извлечения всех членов в определенной группе.

Следующий фрагмент кода будет соответствовать массиву предоставленных вами логинов и узнать, кто является членом с определенными привилегиями, снова $ privileged будет содержать результат (т. Е. Пользователей в вашем списке, которые являются членами указанной вами группы):

$logins = array('root', 'john', 'guest', 'foo'); 
$privileged = array(); 
$groupInfo = posix_getgrnam('admins'); 
if ($groupInfo !== FALSE) { 
    $privileged = array_intersect($logins, $groupInfo['members']); 
} 
+0

Я поместил своих пользователей в группу «adm» и использовал posix_getgrnam() для получения информации. Благодарю. – scrat789

1

переписан после вашего комментария

«Я не хочу знать, если пользователь, который запустить сценарий является корнем или нет. У меня есть проверить в PHP скрипте для некоторых логина/пароль, если они являются корнем или не»

теперь я понял, что вам нужно выполнить корневой аутентификации а в PHP.

Я предлагаю использовать pwauth вместо WHOAMI/логин и т.д.

Here является примером того, как использовать его из PHP, в то время как я считаю, что может быть более простой способ тестирования.

1

Если вы на самом деле означает «есть корень», то вы можете просто проверить whoami, и посмотреть, если он приходит «корень»

exec("whoami"); 

Если это умная вещь, чтобы сделать, это другой вопрос;)

17

Как насчет posix_getuid()?

if (0 == posix_getuid()) { 
    echo "Running as root."; 
} else { 
    echo "not root"; 
} 
+0

Я не хочу знать, является ли пользователь, выполняющий скрипт, root или нет. Я должен проверить скрипт PHP для некоторых логинов/паролей, если они являются корневыми или нет. – scrat789

+0

@scrat Я не понимаю. Вот что делает этот пример. Он проверяет * реальный идентификатор пользователя скрипта; UID для корня обычно равен 0 (ноль). –

+0

@goreSplatter У меня есть список пользователей в моем PHP-скрипте, и я хочу знать для каждого входа, если у него есть привилегии root. – scrat789

3

Попробуйте это.

<?php 
    if (posix_getuid() == 0){ 
     echo "This is root !"; 
     // add more for root 
    } else { 
     echo "This is non-root"; 
    } 
?> 
1

Если вы хотите увидеть, если определенная система пользователя (в отличие от пользователей веб-службы) имеет корень priviliedges, вы можете использовать posix_getpwnam() функцию:

<?php 
    $u = posix_getpwnam("username"); 

    if ($u == FALSE) { 
     print "no-such-user"; 
    } elseif ($u["uid"] == 0) { 
     print "root"; 
    } else { 
     print "non-root"; 
    }; 
?> 

Имейте в виду, что это проверяет только имя пользователя. Если вам также необходимо проверить пароль, который вы действительно должны попытаться выполнить проверку подлинности в системе.

+0

Это интересная функция, но когда я попробовал, у меня был uid> 0, даже если я уверен, что логин - суперпользователь. – scrat789

+0

@ scrat789: тогда вы должны поделиться с нами тем, что ваше определение «суперпользователя». Как вы определяете, является ли учетная запись «суперпользователем», например. из оболочки bash? – thkala

+0

@ scrat789: В большинстве Unix-подобных систем учетная запись суперпользователя - это учетная запись с UID = 0. Обычно существует только одна такая учетная запись («root»), хотя некоторые администраторы устанавливают дополнительные псевдонимы («operator», «sysop») для этого UID по причинам устаревшей совместимости. – thkala

Смежные вопросы