Maison >développement back-end >tutoriel php >Analyse PHP sur les problèmes d'autorisation des scripts Shell
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 :
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é). ;
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 == 'true') { 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 :
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é). ;
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 == 'true') { 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 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 :
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!