Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 24/06/2005, à 18:43

sksbir

Mise en garde avec la commande sudo

jrev a mis le doigt sur un drôle de truc en applicant les instructions d'un tuto concernant le partage de connexion internet : ça se passe ici

Il semblerait que la commande suivante ne fonctionne pas:

sudo echo 1 >/proc/sys/net/ipv4/ip_forward

On récupère effectivement le message bash: /proc/sys/net/ipv4/ip_forward: Permission non accordée

D'apres ce que je sais d'unix, il semblerait que ça provienne de la façon dont le shell interprete tout ça:

On dirait qu'il analyse d'abord la commande 'sudo echo 1', puis redirige le résultat de cette commande vers le fichier ip_forward. Du coup, la redirection de la commande ne se ferait pas avec le privilège de root, ce qui explique le message d'erreur ( ce fichier systeme appartient à root)

J'ai donc voulu inhiber la 1ere interprétation de > en procédant de façon habituelle : mettre un \ devant le > :
sudo echo 1 \> /proc/sys/net/ipv4/ip_forward
Mais j'obtiens alors la réponse suivante:
1 >/proc/sys/net/ipv4/ip_forward

Et là, je pense qu'il se passe la chose suivante: Avec un \ devant le > le > n'est plus interprété comme redirecteur. Mais du coup, le > n'est jamais interprété comme redirecteur

ça n'est pas le cas avec la commande rsh par exemple:
rsh machinedistante echo TOTO \> /tmp/TITI
provoquera bien l'écriture du fichier TITI contenant le mot TOTO sur la machine machinedistante.
alors qu'un
rsh machinedistante echo TOTO > /tmp/TITI
provoquera un 'echo TOTO' exécuté à distance, et dont le résultat sera remonté dans le fichier local /tmp/TITI.


bref, si les spécialistes de la commande sudo veulent se pencher sur ce problème, en attendant , je conseille de passer par

sudo bash
"ma commande avec privileges root et redirection"
exit

dès qu'il y a une redirection dans la commande ( <,  > , >> , << )....

Hors ligne

#2 Le 24/06/2005, à 19:30

pef

Re : Mise en garde avec la commande sudo

C'est plus simple en fait big_smile

echo est une commande "builtin", c'est-à-dire une commande interne à ton shell, pas un binaire à part dans un répertoire bin ou sbin :

loic@iron:~$ type echo
echo is a shell builtin

il faut donc invoquer le shell directement, en lui disant qu'il trouvera un truc à faire en paramètre avec -c :

loic@iron:~$ sudo  bash -c " echo 1 > /proc/sys/net/ipv4/ip_forward "
loic@iron:~$ sudo cat /proc/sys/net/ipv4/ip_forward
1
loic@iron:~$ sudo  bash -c " echo 0 > /proc/sys/net/ipv4/ip_forward "
loic@iron:~$ sudo cat /proc/sys/net/ipv4/ip_forward
0

echo n'existe que pour ton shell, si tu tente de l'exécuter directement avec sudo par exemple, il va le chercher dans le PATH, et ne pas le trouver.

Voilà, j'espère que c'est clair wink

Dernière modification par pef (Le 24/06/2005, à 19:33)

Hors ligne

#3 Le 24/06/2005, à 19:58

sksbir

Re : Mise en garde avec la commande sudo

@pef : je pense que tu vas devoir revoir ton analyse wink

Voici le contre-exemple :

echo 1 > TOTO
cat TOTO
1

ok ,jusque là, ça fonctionne : voici donc l'équivalent de echo 1, mais en utilisant une commande externe.
seulement...

sudo cat TOTO > /proc/sys/net/ipv4/ip_forward
bash: /proc/sys/net/ipv4/ip_forward: Permission non accordée

Et puis aussi, d'habitude, le message par rapport à une commande non trouvée c'est:
sdfsdf
bash: sdfsdf: command not found
sudo sdfsdf
sudo: sdfsdfsd: command not found

Dernière modification par sksbir (Le 24/06/2005, à 20:01)

Hors ligne

#4 Le 24/06/2005, à 20:39

effraie

Re : Mise en garde avec la commande sudo

et avec sudo -s ?


400iso.net
[Trops de chefs, pas assez d'indiens]

Hors ligne

#5 Le 24/06/2005, à 20:46

coxx

Re : Mise en garde avec la commande sudo

Un

sudo su
echo 1 >/proc/sys/net/ipv4/ip_forward
exit

devrait faire l'affaire pour régler les problèmes.

Dernière modification par coxx (Le 24/06/2005, à 20:47)


Monsieur K, de la chanson française parigote indépendante qui frappe fort !

Clips, paroles et sons disponibles sur le myspace de Monsieur K

Hors ligne

#6 Le 24/06/2005, à 20:55

pef

Re : Mise en garde avec la commande sudo

coxx a écrit :

Un

sudo su
echo 1 >/proc/sys/net/ipv4/ip_forward
exit

devrait faire l'affaire pour régler les problèmes.

sudo -s est plus rapide pour obtenir un shell wink

Hors ligne

#7 Le 24/06/2005, à 21:12

pef

Re : Mise en garde avec la commande sudo

sksbir a écrit :

@pef : je pense que tu vas devoir revoir ton analyse wink

Voici le contre-exemple :

echo 1 > TOTO
cat TOTO
1

ok ,jusque là, ça fonctionne : voici donc l'équivalent de echo 1, mais en utilisant une commande externe.
seulement...

sudo cat TOTO > /proc/sys/net/ipv4/ip_forward
bash: /proc/sys/net/ipv4/ip_forward: Permission non accordée

Et puis aussi, d'habitude, le message par rapport à une commande non trouvée c'est:
sdfsdf
bash: sdfsdf: command not found
sudo sdfsdf
sudo: sdfsdfsd: command not found

Ca m'a l'air compliqué finalement cette histoire, sûrement une histoire de redirection par bash avant d'interpréter les commandes fournies, ou alors un truc avec les entrées/sorties standards

Un exemple : avec la commande tee, qui duplique la sortie standard sur un fichier :

loic@iron:/tmp$ cat TOTO |tee resultat
1
loic@iron:/tmp$ cat resultat
1
loic@iron:/tmp$

Là tu es d'accord que la sortie  de la commande est envoyée vers la sortie standard (affichage sur le shell) et dans le fichier resultat

Donc maintenant, quoique j'ajoute à la suite, le fichier resultat devrait de toutes manières recevoir une copie de la sortie grâce à tee :

loic@iron:/tmp$ rm resultat
loic@iron:/tmp$  cat TOTO|tee resultat > /proc/sys/net/ipv4/ip_forward
bash: /proc/sys/net/ipv4/ip_forward: Permission non accordée
loic@iron:/tmp$ cat resultat
cat: resultat: Aucun fichier ou répertoire de ce type

Et pourtant non ! la première commande (cat) n'est pas interprétée, sinon le fichier resultat existerait yikes

De plus si cat n'avait pas le droit de lire /proc/sys/net/ipv4/ip_forward, c'est à lui de le dire, et pas à bash :

loic@iron:~$ cat /proc/sys/net/ipv4/ip_forward
0

Donc dans notre cas, avec l'erreur précédée par un bash:

loic@iron:/tmp$  cat TOTO > /proc/sys/net/ipv4/ip_forward
bash: /proc/sys/net/ipv4/ip_forward: Permission non accordée

Indique bien que c'est bash qui tente de lire le fichier, et non cat


C'est à mon avis un problème au niveau de bash, avant d'être un problème au niveau de sudo, j'essayerai d'approfondir ca demain matin smile

Et merci d'avoir relevé ce problème pour le moins intéressant

Dernière modification par pef (Le 24/06/2005, à 21:22)

Hors ligne

#8 Le 27/06/2005, à 01:43

sksbir

Re : Mise en garde avec la commande sudo

mmm, quand bash indique une permission non accordée, ça ne prouve pas que c'est dans la 1ere partie de ta commande que se trouve le probleme de permission.
Je pense que bash effectue une analyse complète de toute la commande, et traite d'abord les redirections : ça parait logique : il faut d'abord savoir où envoyer le résultat d'une commande avant d'exécuter la commande en question.
Donc bash tente d'abord d'ouvrir un canal en ecriture sur la redirection spécifiée. Comme il y a rejet, c'est toute la commande qui n'est pas exécutée.
A ce niveau, ce qui est anormal, c'est qu'on ne puisse pas indiquer que la redirection doit être englobée dans le périmètre de la commande sudo.
Le bash indiquée dans le message d'erreur est le processus père de la commande : c'est lui qui analyse et exécute toutes les commandes que tu peux passer dans une console donnée.
C'est donc bien normal qu'il n'ait pas le droit d'ouvrir le canal en écriture, et qu'il refuse donc d'exécuter toute la commande.

Je persiste à penser que le bug se situe dans l'analyse du caractère de redirection ">".

D'ailleurs, voici une commande qui vient confirmer mon hypothèse:
echo 1 |sudo tee /proc/sys/net/ipv4/ip_forward

Dernière modification par sksbir (Le 27/06/2005, à 01:46)

Hors ligne

#9 Le 27/06/2005, à 08:46

pef

Re : Mise en garde avec la commande sudo

sksbir a écrit :

mmm, quand bash indique une permission non accordée, ça ne prouve pas que c'est dans la 1ere partie de ta commande que se trouve le probleme de permission.
Je pense que bash effectue une analyse complète de toute la commande, et traite d'abord les redirections : ça parait logique : il faut d'abord savoir où envoyer le résultat d'une commande avant d'exécuter la commande en question.
Donc bash tente d'abord d'ouvrir un canal en ecriture sur la redirection spécifiée. Comme il y a rejet, c'est toute la commande qui n'est pas exécutée.
A ce niveau, ce qui est anormal, c'est qu'on ne puisse pas indiquer que la redirection doit être englobée dans le périmètre de la commande sudo.
Le bash indiquée dans le message d'erreur est le processus père de la commande : c'est lui qui analyse et exécute toutes les commandes que tu peux passer dans une console donnée.
C'est donc bien normal qu'il n'ait pas le droit d'ouvrir le canal en écriture, et qu'il refuse donc d'exécuter toute la commande.

Je persiste à penser que le bug se situe dans l'analyse du caractère de redirection ">".

D'ailleurs, voici une commande qui vient confirmer mon hypothèse:
echo 1 |sudo tee /proc/sys/net/ipv4/ip_forward

c'est bien ce que j'ai dit big_smile

Hors ligne

#10 Le 27/06/2005, à 13:35

sksbir

Re : Mise en garde avec la commande sudo

ha ?, désolé, j'ai du perdre le fil alors... tongue

Bref, ce qui compte, c'est de connaitre cette limitation de sudo, histoire de ne pas faire faire n'importe quoi. smile

Hors ligne