2010-09-16 14 views
10

Dans mon script bash, j'exécute certaines commandes en tant qu'un autre utilisateur. Je veux appeler une fonction bash en utilisant su.Fonction bash en cours de commande de su

my_function() 
{ 
    do_something 
} 

su username -c "my_function" 

Le script ci-dessus ne fonctionne pas. Bien sûr, my_function n'est pas défini à l'intérieur de su. Une idée que j'ai est de mettre la fonction dans un fichier séparé. Avez-vous une meilleure idée qui évite de faire un autre fichier?

Répondre

11

Vous pouvez exporter la fonction pour le rendre à la disposition du sous-shell:

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

Vous pouvez activer 'sudo' dans votre système, et l'utiliser à la place.

+0

sudo n'est pas activé. L'administrateur système ne l'activera pas. –

+2

Comment faites-vous cela avec 'sudo'? un simple 'sudo my_function' ne fonctionnera pas, même après avoir exporté cette fonction. – michas

1

Vous devez avoir la fonction dans la même portée où vous l'utilisez. Placez donc la fonction dans les guillemets, ou placez la fonction dans un script séparé, que vous exécuterez ensuite avec su -c.

+0

Je voudrais appeler le même script en dehors de su. L'autre script était aussi mon idée. –

0

Une autre façon pourrait être fait cas et passer un paramètre au script exécuté. L'exemple pourrait être: Commencez par créer un fichier appelé "script.sh". ensuite insérer ce code dans le:

#!/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 

Après avoir ajouté le code ci-dessus exécuter ces commandes pour le voir en action:

[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]:/# 

Pour faire ce travail que vous devez vous aurez juste besoin de courir

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

et tout devrait bien fonctionner. Espérons que cela aide :)