Utiliser sudo su pour les commandes?

15

Hier soir, je travaillais sur le développement de mes compétences en ligne de commande et j'ai rencontré un problème où, lorsque j'utilisais sudo, j'ai reçu un message d'erreur indiquant `` autorisation refusée ''. Cependant, lorsque j'ai utilisé «sudo su» et que je suis devenu root, la commande a fonctionné.

Pourquoi sudo n'a-t-il pas fonctionné en premier lieu?

C'était:

$ sudo cat > /var/www/info. php
<?php
phpinfo( ) ;
? >
^D

De l'édition Linux Bible 2010 dans la section sur la configuration d'un serveur LAMP.

wdypdx22
la source
Si vous ne donnez pas d'exemple, il est difficile de résoudre le problème.
LassePoulsen
1
Tenez compte sudo -splus sudo su.
Jeremy L

Réponses:

18

Les <,> et >> sont utilisés pour la redirection d'entrée / sortie des commandes - qui est une fonctionnalité fournie par le shell (par exemple, bash). Donc, si vous tapez une commande comme celle-ci, sudo cat > /var/www/info.phple shell qui le reçoit en entrée essaie d'ouvrir le fichier /var/www/info.phpet fournit ce fichier comme sortie standard de la sudocommande. La sudocommande ne sait même pas si sa sortie va sur une console ou est redirigée vers un fichier, car cela est pris en charge par le shell qui l'invoque.

Si le shell dans lequel vous avez tapé votre commande est votre shell de connexion ou un autre shell exécuté dans un terminal avec votre identifiant utilisateur, il a les mêmes privilèges que votre identifiant utilisateur - pas ceux de root.

Donc, dans votre cas, alors que la commande cat est exécutée en tant que root, la copie de sa sortie vers /var/www/info.phpest tentée par le shell s'exécutant en tant qu'utilisateur normal, ce qui, comme prévu, échoue.

Une solution de contournement pour de telles situations consiste à utiliser la teecommande:

sudo tee /var/www/info.php

Cela aura pour effet de mettre tout le texte saisi sur la console jusqu'à ^ D dans le fichier spécifié en paramètre.

Un effet secondaire peut-être indésirable est qu'il teefera également écho à la sortie vers la sortie standard, donc après avoir tapé chaque ligne et appuyé sur Entrée tee, une copie en sera renvoyée. Pour éviter cela, vous pouvez utiliser la variante suivante.

sudo tee /var/www/info.php > /dev/null

Les détails teepeuvent être obtenus via info teeun terminal.

koushik
la source
2

sudo ne fonctionne pas pour les commandes qui ont besoin d'autorisations pour écrire un fichier, telles que:

sudo echo "vm.swappines = 100" >> /etc/sysctl.conf

Il explique dans la page de manuel sudo.

NightwishFan
la source
4
Mentionner que vous pouvez "sudo -i" ou "sudo -s" pour obtenir une invite racine rendrait cette réponse encore meilleure!
Jorge Castro
Il n'y a pas de pipe dans l'exemple de commande; il y a une redirection. En outre, "parfois ne fonctionne pas" semble transmettre un comportement instable sudo. Comme indiqué dans la réponse de koushik, le comportement est assez prévisible, cohérent et "correct" pour le modèle d'autorisation unix.
msw
2

Le problème est que la partie "> foo.txt" est interprétée et exécutée par votre interpréteur de commandes (shell) bien avant l'exécution de la commande sudo. La commande sudo n'a aucune idée que vous souhaitez rediriger sa sortie vers un fichier.

Votre interpréteur de commandes n'a pas l'autorité root (mais la commande sudo finira par la suite), il ne peut donc pas rediriger la sortie vers foo.txt.

Thorbjørn Ravn Andersen
la source
1

Une autre façon de résoudre ce problème est de démarrer un sous-shell avec sudo et d'exécuter cette commande dans ce sous-shell:

$ sudo bash -c "cat > /var/www/info.php"
<?php
phpinfo( ) ;
? >
^D

ici, la commande "has sudo" est bash, et tout ce qui y est exécuté a des droits root.

2c $, * -pique

pic commun
la source