Cómo pasar alias a través de sudo


32

Tengo un alias que pasa algunos parámetros a una herramienta que uso con frecuencia. A veces corro como yo mismo, a veces bajo sudo. Desafortunadamente, por supuesto, sudo no reconoce el alias.

¿Alguien tiene una pista sobre cómo pasar el alias?

En este caso, tengo un montón de opciones para Perl cuando estoy depurando:

alias pd='perl -Ilib -I/home/myuser/lib -d'

A veces, tengo que depurar mis herramientas como root, así que, en lugar de ejecutar:

pd ./mytool --some params

Necesito ejecutarlo bajo sudo. Lo he intentado de muchas maneras:

sudo eval $(alias pd)\; pd ./mytool --some params
sudo $(alias pd)\; pd ./mytool --some params
sudo bash -c "$(alias pd)\; pd ./mytool --some params"
sudo bash -c "$(alias pd); pd ./mytool --some params"
sudo bash -c eval\ "$(alias pd)\; pd ./mytool --some params"
sudo bash -c eval\ "'$(alias pd)\; pd ./mytool --some params'"

Esperaba una forma agradable y concisa de asegurarme de que mi alias pd actual se usara completamente (en caso de que necesite modificarlo más tarde), aunque algunos de mis intentos no fueron concisos en absoluto. Mi último recurso es ponerlo en un script de shell y ponerlo en algún lugar que sudo pueda encontrar. Pero los alias son muy útiles a veces, por lo que es un último recurso.

Respuestas:


50

Se puede encontrar una solución muy elegante en Archlinux-Wiki:

alias sudo='sudo '
# whitespace ---^

trabaja para pasar todos los alias sudo.

Fuente: http://wiki.archlinux.org/index.php/Sudo#Passing_aliases


16
Este es un gran truco! Para los curiosos, la explicación de la sección de alias en la página de manual de bash:A trailing space in value causes the next word to be checked for alias substitution when the alias is expanded.
Russell Davis

1
Esta realmente debería ser la respuesta aceptada.
Adrian Frühwirth

Es una pena que esto no funcione para las funciones.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

2
Nota: Suponiendo que sí es necesario para pasar una opción a la sudovez, mientras que querer mantener ese sudotruco -passthrough al mismo tiempo. Incluso esto se puede hacer: para usar las opciones nuevamente, use \sudo. La barra invertida anulará el alias. (Muchos no parecen saber sobre eso). De esta manera, se puede ( peligro! ) Incluso eliminar archivos sin ninguna advertencia, anulando la alias rm='rm -i'frecuencia especificada en .bash-aliases, simplemente escribiendo \rm file-to-delete.
syntaxerror

11

No tengo muy claro qué estás tratando de hacer. Puedo ver dos formas:

La manera correcta

alias pd='sudo perl -Ilib -I/home/myuser/lib -d'

Luego, la ejecución pd ./mytoolejecutará su comando de depuración como root pero aún conservará los beneficios de sudo (pista de auditoría, no operando desde un shell raíz).

Ejemplo:

insyte $ alias sid = 'sudo id'
insyte $ sid
uid = 0 (raíz) gid = 0 (raíz) grupos = 0 (raíz)

La manera fácil

Agregue los alias a la raíz .bashrcy úselos sudo -isiempre que sudo a la raíz.

root # echo 'alias fb = "echo foo bar"' >> /root/.bashrc
raíz # salida
salida
insyte $ sudo -i
raíz # fb
foo bar

4

Solo tiene dos alias y usa una variable

No veo la razón para usar awko, a cutmenos que sea solo para tener el alias central definido una vez para que sea más fácil modificarlo. Si ese es el caso, entonces esto funciona:

# ... in .bashrc ...
pd='perl -Ilib -I/home/myuser/lib -d'
alias pd="$pd"
alias spd="sudo $pd"

Aquí hay una función simplista para hacer pares de alias como el de arriba:

mkap () {
    alias $1=$2
    alias s$1="sudo $2"
}

Usar:

mkap pd 'perl -Ilib -I/home/myuser/lib -d'
mkap ct 'cat'

Ahora tienes pdy spdmás cty sct.

$ ct /etc/shadow
cat: /etc/shadow: Permission denied
$ sct /etc/shadow
[sudo] password for dennis:
root:[censored]...
$ alias
alias ct='cat'
alias pd='perl -Ilib -I/home/myuser/lib -d'
alias sct='sudo cat'
alias spd='sudo perl -Ilib -I/home/myuser/lib -d'

4

Desearía poder marcar dos respuestas como "correctas". Combinando la forma correcta de la publicación de Insyte , um, perspicaz, con la solución awk (o corte) de Bill Weiss , se me ocurrió esto:

alias spd="sudo $(alias pd | cut -d\' -f2)"

Ahora iré y pondré esto en una función de shell en mi .bashrc o algo así, y luego crearé versiones "s" de todos mis alias que deseo ejecutar como root.

Actualización : ligera modificación de la función simplista de Dennis Williamson para que sea un poco más fácil de usar:

 salias()
 {
   local a c
   a=$(echo "$1" | cut -f1 -d=)
   c=$(echo "$1" | cut -f2- -d=)
   alias $a="$c"
   alias s$a="sudo $c"
 }

Esto significa que solo tengo que poner "s" delante de todo el comando. En lugar de:

alias pd='perl -Ilib -I/home/myuser/lib -d'

Solo agrego la s en el frente.

salias pd='perl -Ilib -I/home/myuser/lib -d'

Y ya terminé. Claro, la computadora hace un poco más de trabajo, pero para eso es una computadora. :-)

¡Gracias!


Se puede (o debe ser capaz de) cosas Marcar como aceptadas, que es algo así como el marcado a corregir :)
Bill Weiss

Correcto - Quiero marcar dos respuestas como correctas
:-P

3
¿Por qué no la respuesta de Slizzered? alias sudo="sudo "funciona perfecto
trusktr


3

¿No sería más fácil simplemente hackear un script que incluye sus opciones, y luego colocarlo en algún lugar de una de las carpetas que es la ruta para la cuenta regular y la raíz? Realmente no tomaría mucho guión.

#!/bin/bash
exec perl -Ilib -I/home/myuser/lib -d $*

En realidad, tiene que ser "$ @" en lugar de $ *, y esa es parte de la razón por la que generalmente trato de evitarlo. ;-) Funciona, solo desperdicia un montón de espacio en disco en relación con lo que contiene.
Tanktalus 01 de

3

Esto es difícil, pero funciona aquí:

houdini@clanspum:~/ > alias fb
fb='echo foo bar'
houdini@clanspum:~/ > alias fb | awk -F\' '{print $2}'
echo foo bar
houdini@clanspum:~/ > sudo sh -c "$(alias fb | awk -F\' '{print $2}')"
foo bar
houdini@clanspum:~/ > sudo sh -c "$(alias fb | awk -F\' '{print $2}') a b c"
foo bar a b c
houdini@clanspum:~/ > fb
foo bar
houdini@clanspum:~/ > fb a b c
foo bar a b c

Pegué una solución incompleta aquí, luego edité para corregir. El actual es correcto. Un upvote gratuito a la primera persona en comentar explicar lo que está pasando aquí :)
Bill Weiss

Esperaba una forma más simple que awk, pero espero! = Realidad a veces ;-) Aparentemente, "cut -f2 -d \ '" funcionaría tan bien como awk, y sería un poco más corto.
Tanktalus

Sí, cortar funcionaría, siempre lo olvido.
Bill Weiss el

3

Agregue un prefijo "sudo" a los alias y comandos seleccionados desde dentro de su me ~/.bashrcgusta así:

#a regular alias
alias pd='perl -Ilib -I/home/myuser/lib -d'

#sudofy (command id, alias pd - add others to this list)
for cmd in id pd;
      do alias "s$cmd"="sudo $cmd";
done;

Eso no funciona, ahí es donde comencé. ¿Lo intentaste?
Tanktalus

Buen concepto Aunque creo que alias sudo="sudo "es más fácil.
trusktr

3

Como publicado algunas veces, hazlo en '.bashrc':

alias sudo = 'sudo'

La razón por la cual se explica en 'man bash' y 'help alias':

alias: alias [-p] [nombre [= valor] ...] Defina o muestre alias.

Without arguments, `alias' prints the list of aliases in the reusable
form `alias NAME=VALUE' on standard output.

Otherwise, an alias is defined for each NAME whose VALUE is given.
**A trailing space in VALUE causes the next word to be checked for
alias substitution when the alias is expanded.**

1

Quieres algo como esto:

(alias; echo "exec < /dev/tty") | sudo bash  -i

Podría estar equivocado, pero ISTR que bash -i(i = interactivo) es solo v4.0. Entonces, en un servidor más antiguo que todavía tiene bashv3 ejecutándose, lo más probable es que falle. Pero prueba que estoy equivocado, cualquiera, adelante;)
syntaxerror

@syntaxerror - Recuerdas mal. -ies Bourne shell, ver: pubs.opengroup.org/onlinepubs/009695399/utilities/sh.html
geocar

Wow, no esperaba recibir una respuesta tan pronto para una publicación de más de 6 años ... ¿Por qué sí, podría haberlo confundido con #!/bin/bash -idespués del shebang, que aparentemente no es lo mismo (?). Para cortar una larga historia corta, utilizando historyen una bashsecuencia de comandos (y no en la línea de comandos "en vivo") va a requerir la -iopción, que he podido conseguir trabajo en un servidor con "sólo" bashv3 instalado. Y eso es un hecho.
syntaxerror

1

No sé si es lo más sabio hacer en una caja de producción, pero localmente uso

alias sudo="sudo -E"

La opción -E ( preservar entorno ) anulará la opción env_reset en sudoers (5)). Solo está disponible cuando el comando correspondiente tiene la etiqueta SETENV o la opción setenv está configurada en sudoers (5).


-1

¿Puede agregar el alias al .bashrc de la raíz o simplemente ejecutar .bashrc a través de sudo antes de su comando?

sudo (. ~yourlogin/.bashrc; pd ./mytool --some params)

1
Um, esto ni siquiera funcionó, tampoco. En realidad, está bastante cerca de algunas de las cosas que probé anteriormente, pero está más lejos de la sintaxis real de shell / sudo.
Tanktalus 01 de
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.