Question Alias ​​non disponibles lors de l'utilisation de sudo


Je jouais avec des alias aujourd'hui et j'ai remarqué que les alias ne semblent pas être disponibles en utilisant 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?


133
2018-01-17 22:47


origine


Avez-vous déclaré ces alias dans .bashrc sur / root / - Luciano Facchinelli
@ LucianoFacchinelli: /root/.bashrc ne se lit pas lors de l'exécution d'une commande via sudo. - Flimm
serverfault.com/questions/61321/how-to-pass-alias-through-sudo - Ciro Santilli 新疆改造中心 六四事件 法轮功
@Flimm: Qu'en est-il de sudo -i? - Evi1M4chine


Réponses:


Ajoutez la ligne suivante à votre ~/.bashrc:

alias sudo='sudo '

Du manuel bash:

Les alias permettent de substituer une chaîne à un mot lorsqu'il est utilisé comme premier mot d'une commande simple. Le shell conserve une liste d'alias pouvant être définis et désactivés avec les commandes intégrées alias et unalias.

Le premier mot de chaque commande simple, s'il n'est pas cité, est vérifié pour voir s'il a un alias. Si c'est le cas, ce mot est remplacé par le texte de l'alias. Les caractères «/», «$», «», «=» et n’importe lequel des métacaractères ou des guillemets figurant ci-dessus peuvent ne pas apparaître dans un pseudonyme. Le texte de remplacement peut contenir toute entrée de shell valide, y compris les métacaractères de shell. Le premier mot du texte de remplacement est testé pour les alias, mais un mot identique à un alias en cours de développement n'est pas étendu une seconde fois. Cela signifie que l'on peut, par exemple, utiliser ls pour "ls -F" et que Bash n'essaie pas d'étendre récursivement le texte de remplacement. Si le dernier caractère de la valeur de l'alias est un caractère d'espace ou de tabulation, le prochain mot de commande suivant l'alias est également vérifié pour l'extension de l'alias.

(Accent mien).
Bash ne vérifie que le premier mot d'une commande pour un alias, aucun mot après celui-ci n'est vérifié. Cela signifie 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 l’alias sudo) en ajoutant un espace à la fin de la valeur de l'alias.


209
2018-01-17 23:08



Jolie solution - ulidtko
Donc, fondamentalement, le problème se résume au fait que sudo est simplement programmé de telle manière qu'il ne vérifie pas les alias, donc on ne trouve pas ll? - kemra102
@DannyRoberts Voir ma réponse mise à jour. - Isaiah
La lecture de la documentation profite évidemment beaucoup :-) - biocyberman
Est-ce que cette pause si j'utilise un drapeau sudo, par ex. sudo -H ll? - Mark E. Haase


J'ai écrit une fonction Bash pour que les ombres sudo.

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

Voici ma fonction de one-liner:

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

Ou bien 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 fichier, n'oubliez pas de le source ou redémarrer votre session de terminal après pour appliquer les modifications cependant.


5
2017-09-27 09:19





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


3
2018-01-17 23:01



Ils sont déjà sous /root/.bashrc donc ce n'est pas un problème - kemra102
Cette réponse ne serait correcte que pour la situation où vous exécutez le shell lui-même en tant que root, comme avec sudo -s ou sudo -i (et seulement si exécuté par lui-même pour obtenir un shell racine, ne pas avec le sudo -s command... ou sudo -i command... formes) ou sudo bash ou sudo su, ou la situation où vous avez activé les connexions root et un shell root de cette façon. Lorsqu'un utilisateur non root s'exécute sudo command... À partir de leur propre shell, l'extension des alias est effectuée par leur propre shell non root. sudo ne développe pas lui-même les alias, donc comme appliqué à la situation décrite dans la question, cette réponse est incorrecte. - Eliah Kagan


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'y a pas besoin de redéfinir sudo avec un alias commander.

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

Solution

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

Exemple

Dans le cas du ll commander

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 apostrophe 'dans ce cas ls -l

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

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


3
2018-02-15 19:37



Peut-être plus simple si vous avez utilisé le alias Builtin, puisque sa sortie est plus propre. alias ll les sorties alias ll='ls -ahlF'. - muru
Voici la version intégrant la suggestion de @ muru: alias ll | sed "s/.*'\(.*\)'.*/\1/g" | xargs sudo. - ACK_stoverflow
Je pense que le but de la question initiale était de sauver le travail en n'ayant pas à sudo -itout d'abord, pour exécuter la commande aliasée, mais tout de suite. Avoir une commande aussi complexe défait cela. Vous pourriez juste faire le premier, et être beaucoup plus rapide. - Evi1M4chine


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

Utilisez l'achèvement de bash pour remplacer automatiquement les mots derrière sudo avec leurs alias en appuyant sur tab.

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

_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

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


1
2017-09-08 16:09



Il existe un moyen d'obtenir une liste d'alias, spécialement conçue pour être complétée: compgen -a - muru
@muru: Merci, mais dans ce cas, j'ai besoin des valeurs, pas des clés. Alors, quel alias qui a été entré sera remplacé par. Vous tapez l'alias, (comme dans sudo ll), appuyez sur [TAB ↹], et le script trouve ll dans la liste des affectations d'alias, supprime ce qui lui est affecté et l'insère. (Vous obtenez donc p.ex. sudo ls -lahvF --color=auto --time-style=long-iso.) - Evi1M4chine


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

Lorsque vous êtes root, le .profile est lancé depuis son répertoire personnel. Si vous ne savez pas quel est le répertoire de base sous root, vous pouvez vérifier avec:

sudo su
echo $HOME

Comme vous pouvez le voir, la maison de root est /root/. Vérifiez son contenu:

cd $HOME
ls -al

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

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

Fondamentalement, ce que fait ce script bash est de rechercher un fichier appelé .bash_aliases. Si les fichiers sont présents, le fichier est exécuté.

Sauver la .profile fichier et créer vos alias dans .bash_aliases. Si le fichier d'alias est déjà prêt, copiez le fichier à cet emplacement.

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


0
2018-06-10 21:06





La réponse la mieux votée est excellente. Cependant si vous tapez sudo -i et élever à une invite sudo (#) vous n'aurez pas les alias que vous souhaitez utiliser.

Pour utiliser vos alias (et tout le reste) au # invite, utilisez:

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

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


0
2017-11-25 02:50