Alias non disponibles lors de l'utilisation de sudo

140

Je jouais avec des alias aujourd'hui et j'ai remarqué que les alias ne semblaient pas être disponibles lorsque vous utilisiez sudo :

danny@kaon:~$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'

danny@kaon:~$ ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //

danny@kaon:~$ sudo -i
root@kaon:~# ll -d /
drwxr-xr-x 23 root root 4096 2011-01-06 20:29 //
root@kaon:~# exit
logout

danny@kaon:~$ sudo ll -d /
sudo: ll: command not found

Y a-t-il une raison pour laquelle vous ne pouvez pas utiliser d'alias lorsque vous utilisez sudo ?

    
posée kemra102 17.01.2011 - 23:47
la source

8 réponses

218

Ajoutez la ligne suivante à votre ~/.bashrc :

alias sudo='sudo '

Extrait du manuel bash :

Aliases allow a string to be substituted for a word when it is used as the first word of a simple command. The shell maintains a list of aliases that may be set and unset with the alias and unalias builtin commands.

The first word of each simple command, if unquoted, is checked to see if it has an alias. If so, that word is replaced by the text of the alias. The characters ‘/’, ‘$’, ‘'’, ‘=’ and any of the shell metacharacters or quoting characters listed above may not appear in an alias name. The replacement text may contain any valid shell input, including shell metacharacters. The first word of the replacement text is tested for aliases, but a word that is identical to an alias being expanded is not expanded a second time. This means that one may alias ls to "ls -F", for instance, and Bash does not try to recursively expand the replacement text. If the last character of the alias value is a space or tab character, then the next command word following the alias is also checked for alias expansion.

(Souligné par moi).
Bash ne vérifie que le premier mot d'une commande pour un alias, les mots qui suivent ne sont pas vérifiés. Cela signifie que dans une commande comme sudo ll , seul le premier mot ( sudo ) est vérifié par bash pour un alias, ll est ignoré. Nous pouvons dire à bash de vérifier le mot suivant après le pseudonyme (c'est-à-dire sudo ) en ajoutant un espace à la fin de la valeur du pseudonyme.

    
réponse donnée Isaiah 18.01.2011 - 00:08
la source
5

J'ai écrit une fonction Bash qui ombrage sudo .

Il vérifie si j'ai un alias pour la commande donnée et exécute la commande avec alias au lieu de l'alias littéral avec sudo dans ce cas.

Voici ma fonction en une ligne:

sudo() { if alias "$1" &> /dev/null ; then $(type "$1" | sed -E 's/^.*'(.*).$//') "${@:2}" ; else command sudo $@ ; fi }

Ou bien formaté:

sudo() { 
    if alias "$1" &> /dev/null ; then 
        $(type "$1" | sed -E 's/^.*'(.*).$//') "${@:2}"
    else 
        command sudo "$@"
    fi 
}

Vous pouvez l'ajouter à votre fichier .bashrc , n'oubliez pas de le rechercher ou de redémarrer votre session de terminal ultérieurement pour appliquer les modifications.

    
réponse donnée Byte Commander 27.09.2016 - 11:19
la source
3

Les alias sont spécifiques à l'utilisateur - vous devez les définir dans /root/.bashrc

    
réponse donnée Ragnar123 18.01.2011 - 00:01
la source
3

La réponse de @Alvins est la plus courte. Sans aucun doute! : -)

Cependant, j'ai pensé à une solution en ligne de commande pour exécuter une commande avec alias dans sudo où il n'est pas nécessaire de redéfinir sudo avec une commande alias .

Voici ma proposition pour ceux à qui cela pourrait intéresser:

Solution

type -a <YOUR COMMAND HERE> | grep -o -P "(?<=\').*(?=')" | xargs sudo

Exemple

Dans le cas de la commande ll

type -a ll | grep -o -P "(?<=\').*(?=')" | xargs sudo

Explication

lorsque vous avez un alias (tel que: ll ), la commande type -a renvoie l'expression avec alias:

$type -a ll
ll is aliased to 'ls -l'

avec grep vous sélectionnez le texte entre l’accent 'et l’apostrophe' dans ce cas ls -l

Et xargs exécute le texte sélectionné ls -l en tant que paramètre de sudo .

Oui, un peu plus long mais complètement propre ;-) Pas besoin de redéfinir sudo comme alias.

    
réponse donnée loved.by.Jesus 15.02.2015 - 20:37
la source
1

J'ai une autre solution intéressante qui ajoute également un peu de confiance:

Utilisez la complétion bash pour remplacer automatiquement les mots derrière sudo par leurs alias lorsque vous appuyez sur la touche de tabulation.

Enregistrez ceci sous /etc/bash_completion.d/sudo-alias.bashcomp et il devrait être automatiquement chargé au démarrage du shell interactif:

_comp_sudo_alias() { from="$2"; COMPREPLY=()
  if [[ $COMP_CWORD == 1 ]]; then
    COMPREPLY=( "$( alias -p | grep "^ *alias $from=" | sed -r "s/^ *alias [^=]+='(.*)'$//" )" )
    return 0
  fi
  return 1
}
complete -o bashdefault -o default -F _comp_sudo_alias sudo

Connectez-vous ensuite à un nouveau terminal et vous devriez être prêt à partir.

    
réponse donnée Evi1M4chine 08.09.2017 - 18:09
la source
0

J'ai une solution différente, vous n'avez pas besoin d'ajouter sudo comme alias. Je lance Linux Mint 17.3 mais cela devrait être assez similaire à Ubuntu.

Lorsque vous êtes root, le .profile est exécuté à partir de son répertoire de base. Si vous ne savez pas quel est le répertoire de base sous la racine, vous pouvez vérifier avec:

sudo su
echo $HOME

Comme vous pouvez le constater, le domicile de root est /root/ . Vérifiez son contenu:

cd $HOME
ls -al

Il devrait y avoir un fichier .profile . Ouvrez le fichier et ajoutez les lignes suivantes:

if [ "$BASH" ]; then
    if [ -f ~/.bash_aliases];then
        . ~/.bash_aliases 
    fi
fi

En gros, ce script bash a pour fonction de rechercher un fichier appelé .bash_aliases . Si les fichiers sont présents, le fichier est exécuté.

Enregistrez le fichier .profile et créez vos alias dans .bash_aliases . Si le fichier d’alias est déjà prêt, copiez-le à cet emplacement

.

Relancez le terminal et vous êtes prêt à partir!

    
réponse donnée Karthik Ramakrishnan 10.06.2016 - 23:06
la source
0

La réponse la plus votée est excellente. Cependant, si vous tapez sudo -i et que vous passez à une invite sudo ( # ), vous ne disposerez pas des alias que vous souhaitez utiliser.

Pour utiliser vos alias (et tout le reste) à l'invite # , utilisez:

sudo cp "$PWD"/.bashrc /root/.bashrc

Où "$ PWD" est automatiquement développé dans "/ home / YOUR_USER_NAME"

    
réponse donnée WinEunuuchs2Unix 25.11.2016 - 03:50
la source
0

@ WinEunuuchs2Unix: $PWD se développe dans le "répertoire de travail actuel". Je pense que vous voulez $HOME .

En outre, dans la plupart des situations, il est probablement préférable d’avoir un fichier racine .bashrc séparé. En fait, je ferais un fichier réel dans /root , un lien symbolique vers celui-ci dans le répertoire de base de l'utilisateur (par exemple, .bashrc_root ) et le chercherais dans le fichier .bashrc de l'utilisateur. Si, à un moment ultérieur, ce compte d'utilisateur privilégié n'est plus présent, le fichier racine .bashrc est toujours disponible pour les autres utilisateurs.

    
réponse donnée 06.10.2018 - 13:04
la source

Lire d'autres questions sur les étiquettes