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 produirait rien.
la source
Réponses:
Le problème est qu’il
source
s’agit d’une commande intégrée de bash (et non d’un programme - commels
ougrep
). Je pense qu'une solution consiste à se connecter en tant que root, puis à exécuter la commande source.la source
source
s’agit d’un shell intégré.sudo su
est une sorte de façon bizarre de le dire - mieux vaut juste diresudo -s
quelle est la façon dont sudo dit de "démarrer un shell comme cet utilisateur". Votre version en une ligne ne fonctionnera pas car chacune des commandes est exécutée par le shell de l'utilisateur principal dans un sous-processus distinct.su
un nouveau shell est lancé et "source" est exécuté uniquement après sa fin. Le premier exemple ne fonctionne que si la deuxième ligne est utilisée à l' intérieur du shell root.sudo -s
n'est pas meilleur quesudo su
. Cela n'aura aucun effet de toute façon.sudo -s
Le démarrage d’un shell a le même effet, mais il me semble inélégant d’empiler deux commandes "devenez un autre utilisateur" quand on le ferait.Le problème n'est pas qu'il
source
s'agisse d'une commande intégrée au shell. Le fait que ce soit la cause de l'command not found
erreur, 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 ceci: 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 deenv
devrait donner des résultats similaires à ceux de son parent.Cependant, en raison de la manière dont il
sudo
fonctionne (comme indiqué dans sa page de manuel), sudo tente de supprimer l'environnement de l'utilisateur et crée un environnement "par défaut" pour l'utilisateur supplantant, afin que l'exécution de la commande soit exécutée comme si l'utilisateur qui l'avait invoqué avait été l'utilisateur appelant (ce qui est le comportement attendu), et donc exécuter Nautilus commesudo nautilus
devrait ouvrir un dossier dans le/root
dossier, et non/home/yourusername
.Alors:
Faire quelque chose comme
sudo source script.sh
et puissudo command
, même si cela fonctionnait, cela ne réussirait pas à définir une variable à plus tardsudo command
.Afin de transmettre les variables d'environnement, vous pouvez demander à sudo de préserver l'environnement (via le
-E
commutateur; disposer des autorisations appropriées dans votre fichier sudoers) et / ou de le définir pour la commandesudo VAR1=VALUE1 VAR2=VALUE2 command
.la source
En utilisant la substitution de processus bash , vous pouvez faire:
la source
sudo
pour accéder au profil. Ce qui précède permet d'importer le profil tout en évitant lesudo: source: command not found
problème mentionné.Comme le dit Marcos , votre principal problème ici est qu’il
source
s’agit d’une commande intégrée du shell qui affecte uniquement le processus du shell dans lequel il s’exécute.La solution la plus simple consiste à démarrer un nouveau shell en tant qu’utilisateur root et bash lira automatiquement au
/etc/bash.bashrc
démarrage. C'est aussi simple que de simplement direla source
La fermeture et la réouverture du terminal ne devraient pas changer les choses. Par défaut, sudo supprime l'environnement. Pour le désactiver, ajoutez -E à sudo.
la source
L'erreur se produit car le binaire que vous essayez d'appeler à partir de la ligne de commande ne constitue 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,
J'ai vérifié si cet emplacement faisait partie de PATH de mon utilisateur root.
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 pour appeler un binaire comme ci-dessous.
En fait, on peut en faire un alias:
Il est également possible de nommer l'alias lui-même sudo, en remplacement du sudo d'origine.
la source