web-dev-qa-db-fra.com

sudo: source: commande introuvable

J'ai mis à jour une partie du profil par défaut pour bash et j'ai vu dans les tutoriels que je suivais que je pouvais recharger le nouveau profil avec les nouveaux paramètres d'environnement en utilisant:

source /etc/bash.bashrc

La seule chose à faire est que les nouvelles variables d'environnement n'étaient disponibles que pour mon utilisateur actuel et ont été ignorées lorsque j'ai utilisé Sudo. Ils ne sont devenus disponibles pour Sudo que lorsque j'ai fermé ma session de terminal et que j'ai rejoint le groupe.

Quand j'essaye d'utiliser:

Sudo source /etc/bash.bashrc

Je reçois l'erreur:

Sudo: source: command not found

Existe-t-il un moyen simple de charger les nouveaux paramètres de profil bash pour Sudo sans avoir à fermer le terminal et à redémarrer?

- Au départ, j'utilisais des scripts d'installation qui faisaient référence aux variables. J'ai constaté qu'alors qu'ils pouvaient accéder aux variables lorsque j'appelais les scripts directement (bien que cela poserait un problème de création de répertoires car je devais être root), appeler les scripts d'installation à l'aide de Sudo ne le ferait pas.

J'ai prouvé cela en testant avec ces commandes simples:

echo $ENV_VARIABLE
Sudo echo $ENV_VARIABLE

Le premier afficherait la valeur de la variable, mais le second ne générerait rien.

52
HorusKol

Le problème est que source est une commande intégrée de bash (et non un programme - comme ls ou grep). Je pense qu'une solution consiste à se connecter en tant que root, puis à exécuter la commande source.

Sudo -s
source /etc/bash.bashrc
69
Marcos Roriz Junior

Le problème n’est pas que source soit une commande intégrée du shell. Le fait que ce soit le cas est ce qui vous a réellement causé l'erreur command not found, mais cela ne signifie pas que cela fonctionnerait si c'était le cas.

Le problème réel est le fonctionnement des variables d’environnement. Et ils fonctionnent comme suit: chaque fois qu’un nouveau processus est démarré, si rien ne se passe, il hérite de l’environnement de son parent. Pour cette raison, utiliser un sous-shell (par exemple, taper bash dans une instance bash) et consulter le résultat de env devrait donner des résultats similaires à ceux de son parent.

Cependant, en raison du fonctionnement de Sudo (comme indiqué dans sa page de manuel), Sudo tente de supprimer l'environnement de l'utilisateur et de créer un environnement "par défaut" pour l'utilisateur supplantant, de sorte que l'exécution de la commande soit exécutée comme si l'utilisateur qui l'a invoqué était l'utilisateur appelant (ce qui est le comportement attendu), et donc exécuter nautilus en tant que Sudo nautilus devrait ouvrir un dossier situé dans le dossier /root et non pas /home/yourusername.

Alors:

Faire quelque chose comme Sudo source script.sh et ensuite Sudo command, même si cela fonctionnait, cela ne réussirait pas à définir une variable avec le Sudo command suivant.

Afin de transmettre les variables d'environnement, vous pouvez indiquer à Sudo de préserver l'environnement (via le commutateur -E et de disposer des autorisations appropriées dans votre fichier sudoers) et/ou de le définir pour la commande sous la forme Sudo VAR1=VALUE1 VAR2=VALUE2 command.

13
ssice

Comme Marcos dit , votre principal problème ici est que source est une commande intégrée du shell qui affecte uniquement le processus du shell dans lequel il est exécuté.

La solution facile consiste simplement à démarrer un nouveau shell en tant que root et bash lira automatiquement /etc/bash.bashrc au démarrage. C'est aussi simple que de simplement dire

Sudo bash
3
poolie

La fermeture et la réouverture du terminal ne devraient pas changer les choses. Sudo supprime l'environnement par défaut. Pour le désactiver, ajoutez -E à Sudo.

2
psusi

En utilisant bash substitution de processus vous pouvez faire:

source <(Sudo cat /etc/bash.bashrc)
2
TomDotTom

L'erreur se produit car le binaire que vous essayez d'appeler à partir de la ligne de commande ne représente qu'une partie de la variable PATH de l'utilisateur actuel, mais pas une partie de PATH de l'utilisateur root.

Vous pouvez le vérifier en localisant le chemin du fichier binaire auquel vous tentez d'accéder. Dans mon cas, j'essayais d'appeler "bettercap-ng". Alors j'ai couru,

$ which bettercap-ng
/home/user/work/bin/bettercap`

J'ai vérifié si cet emplacement faisait partie de PATH de mon utilisateur root.

$ Sudo env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

Donc, Sudo ne peut pas trouver le binaire que j'essaie d'appeler depuis la ligne de commande. Par conséquent, renvoie la commande d'erreur non trouvée.

Vous pouvez demander à Sudo d’utiliser le PATH de l’utilisateur actuel lors de l’appel d’un binaire comme ci-dessous.

Sudo -E env "PATH=$PATH" [command] [arguments]

En fait, on peut en faire un alias:

alias mysudo='Sudo -E env "PATH=$PATH"'

Il est également possible de nommer l'alias lui-même Sudo, en remplacement de Sudo d'origine.

1