Estoy trabajando en una máquina donde no tengo root, pero hay una lista de sudo
comandos permitidos. Uno de estos comandos es /bin/su - foouser
. Entonces puedo escribir sudo su - foouser
y obtengo un shell interactivo como foouser. Entonces puedo ejecutar algunas cosas como foouser
.
El problema es que foouser
se trata de un usuario/shell compartido que se utiliza para generar ciertos procesos de producción importantes. No puedo personalizarlo fácilmente ni configurarlo como quiero. Y no debería trabajar en él de manera constante, lo que divide mis terminales y el historial de comandos entre aquellos en los que he iniciado sesión como yo mismo y aquellos en los que estoy foouser
.
Lo que realmente me gustaría hacer es tener una manera de ejecutar un solo comando como foouser
, bloquearlo, imprimir stdout y stderr en mi shell como lo haría normalmente un comando, y luego regresar conmigo todavía conectado como yo mismo (y no foouser
). Esto podría, por ejemplo, encapsularse en un script para que as_foo bar
ejecute el comando bar
, como foouser
, imprima stdout y stderr, devuelva el código de retorno de bar
y luego me devuelva a mi shell.
Puedo pedirles a los administradores del sistema que cambien los permisos. Por ejemplo, podrían agregarlo bar
a la lista sudo y luego podría usarlo (creo) su -c
para ejecutar la barra de la manera que describí. Pero si al día siguiente quiero correr bar2
, tengo que hablar con ellos nuevamente.
¿Hay alguna salida a este dilema? Parece bastante tonto porque obviamente puedo foouser
ejecutar tantos comandos como quiera, por lo que no veo ninguna diferencia en términos de seguridad. Simplemente no puedo encontrar ninguna manera conveniente y obvia de hacer esto posible.
Respuesta1
sudo su - foouser <command>
requiere que tenga al menos acceso de root limitado para ejecutarse su - foouser <command>
como root.
sudo -u foouser <command>
Puedes hacer lo que quieras en un solo paso. Pero requiere que el administrador del sistema le haya otorgado sudo
acceso a foouser
la cuenta de esta manera:
ignacio ALL=(foouser) ALL
en lugar de esta manera:
ignacio ALL=(root) su - foouser
Configurar sudo
de esta manera le permitirá definir, por ejemplo, un alias como el que imaginó:
as_foo='sudo -u foouser'
Y al evitar el su -
, es posible que pueda seguir usando sus propias personalizaciones: usar sudo
de esta manera cambia solo la identidad del usuario pero mantiene HOME
su valor anterior, leyendo los scripts de inicio del shell y otras personalizaciones desudirectorio de inicio en lugar de foouser
's.
(Por supuesto, esos scripts también deben ser legibles para ese otro usuario, y es mejor que cualquier script compartido que pueda ejecutar se refiera foouser
explícitamente al directorio de inicio de como /home/foouser
en lugar de simplemente $HOME
.)
Sin embargo, hay algunas sudo
configuraciones que pueden impedir que esa solución funcione: si la always_set_home
opción sudo está configurada en el archivo sudoers, o si env_reset
la opción se configura sin agregarla HOME
a la env_keep
lista, HOME
se restablecerá de todos modos. En tal situación, intente agregar la -E
opción al sudo
comando para solicitar explícitamente mantener su entorno.
Y cuando realmente desee ejecutar algo foouser
con el entorno configurado exactamente como está cuando inició sesión foouser
(es decir, el equivalente a sudo su - foouser
), agregue la -i
opción para solicitarlo específicamente. También lo sudo -i -u foouser
es un reemplazo 100% preciso de sudo su - foouser
.
Si encuentra algún sistema con una versión tan antigua sudo
que no tiene la -i
opción, use la -H
opción con sudo: no es un reemplazo perfecto, pero podría ser suficiente. Es muy probable que una versión tan antigua sudo
también tenga algunos errores conocidos sensibles a la seguridad, por lo que valdría la pena actualizarla de todos modos.
Puede usarlo sudo -l
como usted mismo para ver exactamente cómo se define su acceso a sudo y qué opciones de sudo (también conocidas como entradas predeterminadas) están vigentes para usted.
Respuesta2
Pase argumentos adicionales a su
.
sudo su - foouser sh -c 'echo $USER'