IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Demande d'explication : affectation précédant une commande


Sujet :

Shell et commandes GNU

  1. #21
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 324
    Par défaut
    bonjour

    Citation Envoyé par developpeurP00 Voir le message
    Le but final du sujet que j'ai posté est pour comprendre le fonctionnement de ces deux commandes
    si le but ici est juste d'utiliser $PATH avec sudo, tu peux aussi lire le man de sudo (--preserve-env, ...)
    Et, le passage "particulier" de variable d'environnement à cette commande est décrit dans ce même man.

  2. #22
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 120
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Pour moi, ici root n'appelle pas toto.sh mais env qui appelle toto.sh
    et donc ça change quoi ? en plus ça revient à la même chose (non ? je ne suis sûr) car c'est root qui exécute la commande 'env' qui appelle à son tour le script toto.sh

  3. #23
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 120
    Par défaut
    Citation Envoyé par papajoker Voir le message
    bonjour



    si le but ici est juste d'utiliser $PATH avec sudo, tu peux aussi lire le man de sudo (--preserve-env, ...)
    Et, le passage "particulier" de variable d'environnement à cette commande est décrit dans ce même man.

    La solution existe avec "sudo env PATH=$PATH toto.sh" mais il est important de comprendre pourquoi une solution fonctionne et l'autre non. Je dois corriger un grand script qui bogue à cause de ce problème (des commandes invalides non reconnues) et on m'a chargé d'expliquer les raisons de ce bug dans un rapport

  4. #24
    Membre émérite Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 348
    Par défaut
    Citation Envoyé par developpeurP00 Voir le message
    La solution existe avec "sudo env PATH=$PATH toto.sh" mais il est important de comprendre pourquoi une solution fonctionne et l'autre non.
    C'est propre à env, et peut-être même à GNU env :
    Citation Envoyé par https://www.gnu.org/software/coreutils/manual/coreutils.html#env-invocation
    Modifications to PATH take effect prior to searching for command.
    sudo ne fonctionne manifestement pas comme ça.

  5. #25
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 324
    Par défaut
    Citation Envoyé par developpeurP00 Voir le message
    pour comprendre le fonctionnement de ces deux commandes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sudo PATH=$PATH  script  # ne fonctionne pas  : le chemin du script est inconnu
    Si je comprends bien ...

    • ton problème n'est pas de passer la variable d'environnement dans ton script appelé par sudo
    • dans ton script principal, en fait $PATH n'est PAS ta variable d'environnement


    Tu modifies $PATH dans ton script principal ? (avant ton code donné)
    Ton problème est que tu ne sais pas modifier ta variable d'environnement ? donc ton script principal ne trouve pas le second script dans cette variable d'environnement

    Ce nouveau PATH doit être très temporaire ???
    PATH="$NEWPATH" sudo toto.sh PATH="$PATH:/nouveau dir/bin" sudo toto.sh.
    ou,
    la bonne question initiale était simplement comment changer une variable d'environnement dans un script (et ces sous-scripts) ...

  6. #26
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 776
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 776
    Par défaut
    Citation Envoyé par papajoker Voir le message
    Si je comprends bien ...
    En déroulant le fil de discussion on est passé de variable=valeur commande (assez générique) à variable/[commande, prog ou script param].

    Je ne suis pas expert en Linux mais :
    1. lorsque tu remplaces 1 truc simple et universel par 1 truc tordu normal que lorsque cela marche ou pas tu ne peux pas vraiment expliquer pourquoi (ici on peut voir cela comme 2 threads concurrents qu'on veut dire "thread 1 puis thread 2")
    2. lorsque dans 1 commande simple (lancer 1 script) tu es obligé de créer 1 """sous shell""", c'est qu'il y a quelque chose de mauvais (avec env ou carrément avec sh -c 'XXXX')

  7. #27
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 851
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 851
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par developpeurP00 Voir le message
    et on m'a chargé d'expliquer les raisons de ce bug dans un rapport
    Donne leur l'URL de ce topic...

    Citation Envoyé par foetus Voir le message
    En déroulant le fil de discussion on est passé de variable=valeur commande (assez générique) a variable/[commande, prog param].
    En fait, c'est "env" qui fait que ça marche mais en même temps, qui fout la zone dans la compréhension. Et avec le fait que la variable modifiée soit justement le PATH (variable assez primordiale dans la gestion des processus) ça aide pas non plus.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #28
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 376
    Par défaut
    Citation Envoyé par developpeurP00 Voir le message
    et donc ça change quoi ? en plus ça revient à la même chose (non ? je ne suis sûr) car c'est root qui exécute la commande 'env' qui appelle à son tour le script toto.sh
    C'est simplement parce que vous n'avez pas compris comment fonctione la syntaxe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    variable=valeur commande
    cette syntaxe crée une variable "locale" à la commande de DROITE , donc sudo ne voit pas l'affectation de PATH, par contre pour la commande env , c'est différent, car pour elle c'est un paramètre qu'elle doit tenir compte et dont c'est le boulot.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ env --help
    Utilisation*: env [OPTION]... [-] [NOM=VALEUR]... [COMMANDE [ARG]...]
    Initialiser chaque NOM à VALEUR dans l'environnement et exécuter COMMANDE.

  9. #29
    Membre émérite Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 348
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    C'est simplement parce que vous n'avez pas compris comment fonctione la syntaxe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    variable=valeur commande
    cette syntaxe crée une variable "locale" à la commande de DROITE , donc sudo ne voit pas l'affectation de PATH, par contre pour la commande env , c'est différent, car pour elle c'est un paramètre qu'elle doit tenir compte et dont c'est le boulot.
    Ce que tu dis est vrai pour la syntaxe variable=valeur sudo commande, mais pas pour la syntaxe sudo variable=valeur commande. Dans ce dernier cas, variable=valeur est un argument de sudo comme il l'est pour env, et donc sudo pourrait le traiter comme le fait env (cf. https://www.developpez.net/forums/d2.../#post11961400 ), mais elle ne le fait pas.

  10. #30
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 376
    Par défaut
    Non, soit tu as fait une typo et inversé tes 2 commandes sudo dans ton explication (ce qui serait plus logique pour moi):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PATH=$PATH sudo commande
    ceci ne fonctionne pas car sudo par mesure de sécurité ne tient pas compte de l'environnement appelant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sudo PATH=$PATH commande
    ne permet pas à sudo de trouver la commande car on lui dit juste de fournir une variable à la commande mais pas de l'intégrer dans son env.
    pour preuve:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/bin/bash
     
    echo $PATH
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ echo $PATH
    /opt/disedorgue/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin
    $ ./pre.sh 
    /opt/disedorgue/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin
    $ PATH=/bin ./pre.sh
    /bin
    $ echo $PATH
    /opt/disedorgue/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin
    comme on peut le voir ici, PATH n'est pas modifié dans mon shell appelant (c'est pareil pour sudo)

  11. #31
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 851
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 851
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PATH=$PATH sudo commande
    ceci ne fonctionne pas car sudo par mesure de sécurité ne tient pas compte de l'environnement appelant
    Ah, ça je savais pas

    Citation Envoyé par disedorgue Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sudo PATH=$PATH commande
    ne permet pas à sudo de trouver la commande car on lui dit juste de fournir une variable à la commande mais pas de l'intégrer dans son env.
    Ca oui je l'avais déjà décrit ici.
    D'où sudo PATH=$PATH sh -c 'commande' afin que ce soit "sh" qui lance la commande ; sh processus déjà lancé à ce moment là donc connaissant le PATH modifié.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  12. #32
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 673
    Par défaut
    ça peut être contourner avec --perserve-env[=LIST] ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  13. #33
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 851
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 851
    Billets dans le blog
    1
    Par défaut
    Pense pas.
    En reprenant mon "toto.sh" copié dans mon bin, j'ai tenté...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sudo --preserve-env=PATH toto.sh
    sudo --preserve-env=PATH PATH=$PATH toto.sh
    ... mais rien n'a réussi.

    En revanche, en modifiant "toto.sh" pour lui faire afficher "$var", puis en écrivant export var=123, alors sudo --preserve-env=var ./toto.sh fonctionne.
    Donc le "--preserve-env" c'est pour transmettre au fils, pas pour permettre au PATH d'évoluer afin de pouvoir créer ce fils.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  14. #34
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 673
    Par défaut
    Citation Envoyé par papajoker Voir le message
    si le but ici est juste d'utiliser $PATH avec sudo, tu peux aussi lire le man de sudo (--preserve-env, ...)
    Et, le passage "particulier" de variable d'environnement à cette commande est décrit dans ce même man.


    Citation Envoyé par Sve@r Voir le message
    le "--preserve-env" c'est pour transmettre au fils, pas pour permettre au PATH d'évoluer afin de pouvoir créer ce fils.
    ah, d'accord !
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  15. #35
    Membre émérite Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 348
    Par défaut
    @disedorgue: je maintiens
    Cette syntaxe a besoin d'être interprétée par un shell: variable=valeur sudo commande, et ce que fait le shell est d'ajouter variable=valeur à l'environnement de la commande sudo commande avant de la lancer.
    Le fait que sudo ignore l'environnement appelant est un autre problème.

    Cette syntaxe n'a pas besoin d'être interprétée par un shell: sudo variable=valeur commande, car variable=valeur est un argument de la commande sudo (et commande en est un autre argument), tout comme il est un argument de la commande env dans les posts précédents.
    Le fait que sudo traite cet argument "comme le fait le shell" (manifestement) et non pas comme le fait env, est en quelques sortes accidentel : essentiellement c'est un argument, et sudo pourrait en faire autre chose.

    C'est cette distinction que je voulais faire, mais pour le reste je constate comme vous le comportement démontré.

  16. #36
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 376
    Par défaut
    Pour le premier cas, on est d'accord, c'est un problème inhérent à sudo.
    Pour le deuxième cas, tu auras le même souci que sudo via Bash ou autre shell car la définition de la variable est juste pour la commande de droite : sudo n'est rien d'autre qu'une surcouche à sh qui permet au sh de se lancer dans un autre env.
    Ce que je veux dire par là, c'est que pour sudo, il n'a qu'un seul paramètre, toute la ligne (ou jusqu'au ; )

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Affécter une commande à une variable
    Par bogosse dans le forum Linux
    Réponses: 2
    Dernier message: 16/03/2006, 15h53
  2. Explication d'une commande unix
    Par claralavraie dans le forum Linux
    Réponses: 4
    Dernier message: 14/02/2006, 17h22
  3. petite explication d'une commande
    Par ghitalove dans le forum ASP
    Réponses: 4
    Dernier message: 13/12/2005, 09h58
  4. petite explication d'une commande
    Par ghitalove dans le forum Langage SQL
    Réponses: 4
    Dernier message: 09/12/2005, 11h52
  5. Réponses: 3
    Dernier message: 20/09/2005, 18h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo