Maison  >  Article  >  développement back-end  >  Analyse PHP sur les problèmes d'autorisation des scripts Shell

Analyse PHP sur les problèmes d'autorisation des scripts Shell

小云云
小云云original
2018-03-01 11:40:231592parcourir

1. Introduction à sudo

sudo permet à root d'attribuer certains droits que les utilisateurs ordinaires n'ont pas, afin que les utilisateurs ordinaires puissent également disposer des autorisations pertinentes de l'utilisateur root (par exemple, sudo peut être attribué à un certain utilisateur, une certaine autorisation d'exécution de commande).
L'un des fichiers importants pour sudo est /etc/sudoers. Les utilisateurs disposant du type de commandes pouvant être exécutées dépendent de ce fichier. Principalement, seuls les utilisateurs qui y sont affectés peuvent utiliser sudo.

sudo -l 列出该用户能执行的命令  
sudo -u user 以指定用户来执行命令  
sudo -k 清楚入场券上的时间,下次使用sudo还要输入密码  
sudo -b 在后台执行命令

Entrez vim dans le terminal pour ouvrir le fichier /etc/sudoers.
Trouvez l'endroit comme indiqué sur l'image :
Analyse PHP sur les problèmes dautorisation des scripts Shell

Le contenu dans la zone rouge de l'image a été ajouté par moi-même plus tard, où www est l'utilisateur qui exécute php, et la valeur par défaut est dans des environnements différents Le nom sera différent Mon nom sous centos est www.

Les utilisateurs qui peuvent visualiser l'opération php peuvent l'obtenir via la page Web php suivante.

<?php    
    echo shell_exec("id -a");  
?>

Regardez l'image. Il y a trois ALL dans chaque ligne. Le premier ALL représente l'hôte du réseau. Le ALL dans la deuxième parenthèse représente l'utilisateur cible, indiquant qui exécute la commande. Enfin An ALL représente le nom de la commande exécutable (vous pouvez spécifier la commande que vous souhaitez que l'utilisateur puisse exécuter).

NOPASSWD signifie qu'aucun mot de passe n'est requis. (Pour plus de commodité, sinon, si j'accède au programme via un navigateur, il y aura une étape supplémentaire pour remplir le mot de passe et attendre les commentaires. C'est vraiment gênant. Cela évitera bien des ennuis)

S'il s'agit d'Ubuntu, il n'est pas nécessaire de le modifier. S'il s'agit de Fedora. Si tel est le cas, certaines modifications sont encore nécessaires.

Par défaut, Env_reset peut être activé (c'est-à-dire que le signe # devant est supprimé). ;

  1. Vérifiez s'il est activé dans le fichier de configuration php.ini. Le mode sans échec est activé

safe_mode =  off 这样就可以了

Il existe plusieurs fonctions pour PHP pour exécuter des scripts Linux, tels que shell_exec(), system(), etc. Je n'entrerai pas dans les détails ici. Utilisez-le simplement.
route.php

<?php   $ip=(string)$_POST["ip"];  
system("su ./route.sh $ip",$status);  
if($status == &#39;true&#39;)  
{  
    echo "设置成功";  
}  
else  {  
    echo "设置失败";  
}  
?>

Une fois les paramètres précédents correctement définis, après l'exécution, le navigateur affichera le paramètre comme réussi, indiquant que le script a été exécuté avec succès.

Le shell d'exécution 1.php est en fait exécuté par l'utilisateur d'Apache ou de Nginx, et php lui-même ne crée pas d'utilisateur.
2. Republié depuis

Comme je me connectais et fonctionnais en tant qu'utilisateur root à chaque fois dans ECS, sudo n'était pratiquement pas utilisé, mais récemment, le projet doit faire ceci : Passer lorsque le navigateur accède. la page web php, un script sous Linux sera appelé et exécuté dans la page web php. À l'origine, cette affaire était très simple, mais lorsque je l'ai réellement utilisé, j'ai constaté qu'à chaque fois que j'y accédais via le navigateur, le script n'était pas exécuté, et il n'y avait aucun problème lorsque j'exécutais la page Web php via la ligne de commande dans le terminal. J'ai pensé que c'était très différent. Ensuite, j'y ai réfléchi attentivement et j'ai découvert que l'accès via un navigateur était différent de l'exécution de l'initiateur directement dans le terminal. J'ai pensé que cela pourrait être un problème avec les autorisations des utilisateurs, j'ai donc vérifié en ligne et trouvé un truc sudo.
1. Introduction à sudo

sudo permet à root d'attribuer certains droits que les utilisateurs ordinaires n'ont pas, de sorte que les utilisateurs ordinaires puissent également disposer des autorisations pertinentes de l'utilisateur root (par exemple, sudo peut être attribué à un certain utilisateur pour exécuter certaines commandes) autorisations).
L'un des fichiers importants pour sudo est /etc/sudoers. Les utilisateurs disposant du type de commandes pouvant être exécutées dépendent de ce fichier. Principalement, seuls les utilisateurs qui y sont affectés peuvent utiliser sudo.

sudo -l 列出该用户能执行的命令  
sudo -u user 以指定用户来执行命令  
sudo -k 清楚入场券上的时间,下次使用sudo还要输入密码  
sudo -b 在后台执行命令

Entrez vim dans le terminal pour ouvrir le fichier /etc/sudoers.
Trouvez l'endroit comme indiqué sur l'image :
Analyse PHP sur les problèmes dautorisation des scripts Shell

Le contenu dans la zone rouge de l'image a été ajouté par moi-même plus tard, où www est l'utilisateur qui exécute php, et la valeur par défaut est dans des environnements différents Le nom sera différent Mon nom sous centos est www.

Les utilisateurs qui peuvent visualiser l'opération php peuvent l'obtenir via la page Web php suivante.

<?php    
    echo shell_exec("id -a");  
?>

Regardez l'image. Il y a trois ALL dans chaque ligne. Le premier ALL représente l'hôte du réseau. Le ALL dans la deuxième parenthèse représente l'utilisateur cible, indiquant qui exécute la commande. Enfin An ALL représente le nom de la commande exécutable (vous pouvez spécifier la commande que vous souhaitez que l'utilisateur puisse exécuter).

NOPASSWD signifie qu'aucun mot de passe n'est requis. (Pour plus de commodité, sinon, si j'accède au programme via le navigateur, il y aura une étape supplémentaire pour remplir le mot de passe et attendre les commentaires. C'est vraiment gênant. Cela évitera bien des ennuis)

S'il s'agit d'Ubuntu, il n'est pas nécessaire de le modifier. S'il s'agit de Fedora. Si tel est le cas, certaines modifications sont encore nécessaires.

Par défaut, Env_reset peut être activé (c'est-à-dire que le signe # devant est supprimé). ;

  1. Vérifiez s'il est activé dans le fichier de configuration php.ini. Le mode sans échec est activé

safe_mode =  off 这样就可以了

Il existe plusieurs fonctions pour PHP pour exécuter des scripts Linux, tels que shell_exec(), system(), etc. Je n'entrerai pas dans les détails ici. Utilisez-les simplement.
route.php

<?php   $ip=(string)$_POST["ip"];  
system("su ./route.sh $ip",$status);  
if($status == &#39;true&#39;)  
{  
    echo "设置成功";  
}  
else  {  
    echo "设置失败";  
}  
?>

Une fois les paramètres précédents correctement définis, après l'exécution, le navigateur affichera le paramètre comme réussi, indiquant que le script a été exécuté avec succès.

  1. Le shell d'exécution PHP est en fait exécuté par l'utilisateur Apache ou Nginx. PHP lui-même ne crée pas d'utilisateur.

Recommandations associées :

Comment résoudre le problème selon lequel PHP ne génère pas de fichiers core lors de l'exécution de scripts shell

Exemple d'installation en un clic de php7 par script shell

Exemple de commande de script shell

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn