Alias ​​no disponibles cuando se usa sudo

133

Estuve jugando con alias hoy y noté que los alias no parecen estar disponibles mientras uso 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

¿Hay algún motivo por el que no pueda usar alias mientras usa sudo ?

    
pregunta kemra102 17.01.2011 - 23:47

7 respuestas

209

Agregue la siguiente línea a su ~/.bashrc :

alias sudo='sudo '

Del manual de bash :

  

Los alias permiten que una cadena se sustituya por una palabra cuando se usa como la primera palabra de un comando simple. El shell mantiene una lista de alias que pueden establecerse y deshacerse con los comandos integrados alias y unalias.

     

La primera palabra de cada comando simple, si no está citada, se verifica para ver si tiene un alias . Si es así, esa palabra es reemplazada por el texto del alias. Los caracteres '/', '$', '' ',' = 'y cualquiera de los metacaracteres del intérprete de comandos o los caracteres citados anteriormente pueden no aparecer en un nombre de alias. El texto de reemplazo puede contener cualquier entrada de shell válida, incluidos los metacaracteres del shell. La primera palabra del texto de reemplazo se prueba para alias, pero una palabra que es idéntica a un alias que se está expandiendo no se expande por segunda vez. Esto significa que uno puede alias ls a "ls -F", por ejemplo, y Bash no intenta expandir recursivamente el texto de reemplazo. Si el último carácter del valor de alias es un espacio o un carácter de tabulación, la siguiente palabra de comando que sigue al alias también se comprueba para la expansión de alias .

(Énfasis mío).
Bash solo verifica la primera palabra de un comando para un alias, las palabras posteriores no están marcadas. Eso significa que en un comando como sudo ll , bash solo verifica la primera palabra ( sudo ) para un alias, ll se ignora. Podemos decirle a bash que compruebe la siguiente palabra después del alias (es decir, sudo ) agregando un espacio al final del valor del alias.

    
respondido por el Isaiah 18.01.2011 - 00:08
5

Escribí una función Bash que sombrea sudo .

Comprueba si tengo un alias para el comando dado y ejecuta el comando con alias en lugar del literal con sudo en ese caso.

Aquí está mi función como una línea:

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

O bien formateado:

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

Puedes agregarlo a tu archivo .bashrc , no olvides encontrarlo o reiniciar tu sesión de terminal para aplicar los cambios.

    
respondido por el Byte Commander 27.09.2016 - 11:19
3

Los alias son específicos del usuario; debe definirlos en /root/.bashrc

    
respondido por el Ragnar123 18.01.2011 - 00:01
3

La respuesta de Alvin es la más corta. ¡Sin duda! : -)

Sin embargo, pensé en una solución de línea de comandos para ejecutar un comando con alias en sudo donde no hay necesidad de redefinir sudo con un comando alias .

Aquí está mi propuesta para aquellos a los que les puede interesar:

Solución

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

Ejemplo

En el caso del comando ll

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

Explicación

cuando tienes un alias (como: ll ) el comando type -a devuelve la expresión con alias:

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

con grep selecciona el texto entre el acento 'y el apóstrofo' en ese caso ls -l

Y xargs ejecuta el texto seleccionado ls -l como parámetro de sudo .

Sí, un poco más, pero completamente limpio ;-) No es necesario redefinir sudo como alias.

    
respondido por el loved.by.Jesus 15.02.2015 - 20:37
1

Tengo otra buena solución que agrega un poco de confianza también:

Utilice la finalización de bash para reemplazar automáticamente las palabras detrás de sudo con sus alias al presionar tabulador.

Guarde esto como /etc/bash_completion.d/sudo-alias.bashcomp , y debe cargarse automáticamente en el inicio interactivo del shell:

_comp_sudo_alias() { from=""; 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

Luego inicie sesión en una nueva terminal, y debería estar listo para ir.

    
respondido por el Evi1M4chine 08.09.2017 - 18:09
0

Tengo una solución diferente por la que no necesita agregar sudo como alias. Ejecuto Linux Mint 17.3 pero debería ser bastante similar a Ubuntu.

Cuando eres root, el .profile se ejecuta desde su directorio de inicio. Si no sabe cuál es el directorio de inicio en la raíz, puede verificar con:

sudo su
echo $HOME

Como puede ver, el hogar de root es /root/ . Verifique su contenido:

cd $HOME
ls -al

Debería haber un archivo .profile . Abra el archivo y agregue las siguientes líneas:

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

Básicamente, lo que hace este script bash es buscar un archivo llamado .bash_aliases . Si los archivos están presentes, ejecuta el archivo.

Guarde el archivo .profile y cree sus alias en .bash_aliases . Si ya tiene listo el archivo de alias, copie el archivo a esta ubicación

¡Vuelve a iniciar la terminal y ya estás listo!

    
respondido por el Karthik Ramakrishnan 10.06.2016 - 23:06
0

La respuesta más votado es excelente. Sin embargo, si escribe sudo -i y lo eleva a un indicador de sudo ( # ), no tendrá los alias que desea usar.

Para utilizar sus alias (y todo lo demás) en el indicador # , use:

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

Donde "$ PWD" se expande automágicamente en "/ home / YOUR_USER_NAME"

    
respondido por el WinEunuuchs2Unix 25.11.2016 - 03:50

Lea otras preguntas en las etiquetas