2010-09-16 11 views
10

En mi secuencia de comandos bash, ejecuto algunos comandos como otro usuario. Quiero llamar a una función bash usando su.Ejecutando la función bash al comando de su

my_function() 
{ 
    do_something 
} 

su username -c "my_function" 

La secuencia de comandos anterior no funciona. Por supuesto, my_function no está definido dentro de su. Una idea que tengo es poner la función en un archivo separado. ¿Tienes una mejor idea que evita hacer otro archivo?

Respuesta

11

Puede exportar la función para que esté disponible para el subnivel:

export -f my_function 
su username -c "my_function" 
2

Puede habilitar 'sudo' en su sistema y usarlo en su lugar.

+0

sudo no está habilitado. El administrador del sistema no lo habilitará. –

+2

¿Cómo se hace esto con 'sudo'? un simple 'sudo my_function' no funcionará, incluso después de exportar esa función. – michas

1

Debe tener la función en el mismo ámbito donde la usa. Así que coloque la función dentro de las comillas o coloque la función en una secuencia de comandos separada, que luego ejecutará con su -c.

+0

Me gustaría llamar al mismo script fuera de su. El otro guión también fue idea mía. –

0

Otra forma podría estar haciendo los casos y que pasa un parámetro a la secuencia de comandos ejecutados. El ejemplo podría ser: Primero crea un archivo llamado "script.sh". A continuación, introduzca el código en él:

#!/bin/sh 

my_function() { 
    echo "this is my function." 
} 

my_second_function() { 
    echo "this is my second function." 
} 

case "$1" in 
    'do_my_function') 
     my_function 
     ;; 
    'do_my_second_function') 
     my_second_function 
     ;; 
    *) #default execute 
     my_function 
esac 

Después de añadir el código anterior ejecutar estos comandos para verlo en acción:

[email protected]:/# chmod +x script.sh #This will make the file executable 
[email protected]:/# ./script.sh   #This will run the script without any parameters, triggering the default action.   
this is my function. 
[email protected]:/# ./script.sh do_my_second_function #Executing the script with parameter 
this function is my second one. 
[email protected]:/# 

Para que esto funcione como usted requirió que sólo tendrá que ejecutar

su username -c '/path/to/script.sh do_my_second_function' 

y todo debería funcionar bien. Espero que esto ayude :)

Cuestiones relacionadas