¿Hay alguna manera de que pueda pasar una función de un usuario a otro?
Por ejemplo, tengo un pequeño script Bash que ejecuto como Root:
#!/bin/bash
user_func(){
whoami
exit
}
su vagrant -c 'user_func'
Sin embargo, la función user_func no está definida para el usuario Vagrant, solo para Root, y no se puede ejecutar.
Mi otra opción sería tener múltiples líneas de
su vagrant -c 'cmd1'
su vagrant -c 'cmd2'
, etc
O bien, ejecute varios comandos, por ejemplo: su vagrant -c 'cmd1; cmd2; cmd3;'
pero preferiría no tener el exceso, especialmente cuando intente ejecutar más de 5 comandos como usuario de Vagrant.
¿Es posible pasar una Función a otro usuario desde el mismo script (por ejemplo, no crear un script en el disco como un usuario diferente y luego ejecutar ese script generado)? ¿O hay otra opción que estoy pasando por alto?
su
anula el medio ambiente.vagrant
esbash
. Si no,su vagrant -c 'bash -c user_func'
Es un poco difícil, pero puede imprimir la definición de la función dentro del sommand pasado
su
y, por supuesto, puede usarla.Esto funcionará incluso si por alguna razón
su
se sobrescribe el entorno del shell generado , ya que coloca la definición después de la inicialización del shell. Si escribe la función de manera suficientemente compatible, incluso funcionará cuando los dos usuarios en cuestión estén usando shells diferentes.fuente
su
puede sobrescribir el entorno del shell por factores externos? Quiero decir, en este caso tienes control total sobre lasu
línea de comando ya que está en un script. ¿Cómo se puede sobrescribir el entorno de su nuevo shell?su
podría hacer una inicialización del entorno. Tambiénsu
podría eliminar parte del entorno de la persona que llama para reforzar un poco la seguridad (aunque esto generalmente se hace con alternativas más potentes comosudo
).Ese no es un script que tienes, es una función. Sin embargo, parece que quieres un guión. Cree un guión adecuado y póngalo, según lo requieran sus necesidades, ya sea en
/usr/local/bin
o dentro/home/vagrant/bin
, y de lo que debería poder, p.su vagrant -c '/home/vagrant/bin/myscript.sh'
fuente
Otra forma algo más portátil de hacer esto (sin dependencia de bash) es hacer que su script se llame a sí mismo y que su comportamiento cambie según el contexto (uid) o los parámetros. Se dan ejemplos de esto en la documentación
super
donde muestran un script que necesita permisos de root, llamándose a sí mismo a través de super cuando no es root.fuente