204 votes

Alias non disponibles lors de l'utilisation de sudo

J'ai joué avec les alias aujourd'hui et j'ai remarqué que les alias ne semblent pas être disponibles lors de l'utilisation de l'outil de gestion des données. 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 tout en utilisant sudo ?

330voto

Craig Smitham Points 522

Ajoutez la ligne suivante à votre ~/.bashrc :

alias sudo='sudo '

Desde el manuel bash :

Les alias permettent de substituer une chaîne de caractères à un mot lorsqu'elle est utilisée comme premier mot d'une commande simple. Le Shell maintient une liste d'alias qui peuvent être activés et désactivés avec les commandes intégrées alias et unalias.

Le premier mot de chaque commande simple, si elle n'est pas citée, est vérifié pour voir si elle a un alias. . Si c'est le cas, ce mot est remplacé par le texte de l'alias. Les caractères '/', '$', '`', '=' et tout autre métacaractère Shell ou caractère de citation listé ci-dessus ne peuvent pas apparaître dans un nom d'alias. Le texte de remplacement peut contenir toute entrée Shell valide, y compris les métacaractères Shell. Le premier mot du texte de remplacement est testé pour les alias, mais un mot identique à un alias développé n'est pas développé une seconde fois. Cela signifie que l'on peut aliaser ls en "ls -F", par exemple, et Bash n'essaie pas de développer récursivement le texte de remplacement. Si le dernier caractère de la valeur de l'alias est un espace ou un caractère de tabulation, le mot de commande suivant l'alias est également vérifié pour l'expansion de l'alias. .

(C'est moi qui souligne).
Bash vérifie uniquement le premier mot d'une commande pour un alias, tous les mots suivants 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ée. Nous pouvons dire à bash de vérifier le prochain mot après l'alias (i.e. sudo ) en ajoutant un espace à la fin de la valeur de l'alias.

5voto

Byte Commander Points 99026

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

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

Voici ma fonction en une ligne :

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

Ou joliment formaté :

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

Vous pouvez l'ajouter à votre .bashrc n'oubliez pas de le source ou de redémarrer votre session terminal après pour appliquer les changements.

4voto

Ragnar123 Points 268

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

4voto

loved.by.Jesus Points 437

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 aliasée dans sudo où il n'est pas nécessaire de redéfinir sudo avec un alias commandement.

Voici ma proposition pour ceux que cela peut intéresser :

Solution

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

Exemple

Dans le cas de la ll commande

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

Explication

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

$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 ;-) Il n'est pas nécessaire de redéfinir sudo comme alias.

2voto

Evi1M4chine Points 158

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

Utiliser la complétion bash pour remplacer automatiquement les mots derrière sudo avec leurs alias en appuyant sur la touche tabulation.

Enregistrer 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 [^=]+='(.*)'$/\1/" )" )
    return 0
  fi
  return 1
}
complete -o bashdefault -o default -F _comp_sudo_alias sudo

Puis connectez-vous à un nouveau terminal, et vous devriez être prêt.

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