81 votes

Sudo: source: commande introuvable

J'ai mis à jour certains des profils 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 est que les nouvelles variables d'environnement n'étaient disponibles que pour mon utilisateur actuel et étaient ignorées lorsque j'utilisais sudo. Elles n'étaient disponibles pour sudo que lorsque j'ai fermé ma session de terminal et que je l'ai rouverte.

Quand j'essaie d'utiliser :

sudo source /etc/bash.bashrc

Je reçois l'erreur :

sudo: source: command not found

Y a-t-il un moyen simple de charger les nouveaux paramètres de profil bash pour sudo sans devoir fermer le terminal et redémarrer ?

-- Initialement, j'utilisais des scripts d'installation qui faisaient référence aux variables. J'ai trouvé que bien qu'ils puissent accéder aux variables lorsque j'appelais les scripts directement (bien que cela posait un problème ultérieur avec la création de répertoires car j'avais besoin d'être root), appeler les scripts d'installation avec 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 deuxième n'afficherait rien.

2voto

Anonymous Platypus Points 3370

L'erreur se produit car le binaire que vous essayez d'appeler depuis la ligne de commande fait uniquement partie de la variable PATH de l'utilisateur actuel, mais pas partie de la variable PATH de l'utilisateur root.

Vous pouvez vérifier ceci en localisant le chemin d'accès du binaire que vous essayez d'accéder. Dans mon cas, j'essayais d'appeler "bettercap-ng". J'ai donc exécuté la commande suivante :

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

J'ai vérifié si cet emplacement faisait partie du 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. D'où l'erreur de commande introuvable.

Vous pouvez indiquer à sudo d'utiliser le PATH de l'utilisateur actuel lors de l'appel d'un binaire comme ci-dessous.

sudo -E env "PATH=$PATH" [commande] [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, remplaçant le sudo original.

1voto

shivampip Points 301

Certaines shells UNIX ne prennent pas en charge source. au lieu de cela, ils prennent en charge .. Essayez donc ceci

. /etc/bash.bashrc

En espérant que cela fonctionne

0voto

Dan Bray Points 101

Ça ne marche pas parce que source est une commande intégrée, pas un programme. J'ai écrit un script bash pour forcer sudo sur les commandes intégrées :

#!/bin/bash

function forceSudo()
{
    command="${@}"
    file="${@: -1}"
    if ! $command 2>/dev/null
    then
        permission=$(stat -c '%a' $file)
        sudo chmod o+rx $file
        result=$command 2>/dev/null
        sudo chmod $permission $file
        if ! $result
        then
            echo $result
        fi
    fi
}

Enregistrez le fichier sous le nom de forceSudo et enregistrez-le à l'emplacement de vos scripts, éventuellement ~/.local/bin. Pour éviter d'avoir à sourcer le fichier avant d'utiliser la fonction, ajoutez alias forceSudo='unalias forceSudo && . forceSudo && forceSudo "$@"' à ~/.bashrc.

Maintenant vous pouvez utiliser forceSudo source /etc/bash.bashrc.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X