2010-09-16 9 views
10

In meinem Bash-Skript, führe ich einige Befehle als ein anderer Benutzer. Ich möchte eine Bash-Funktion mit su aufrufen.Running Bash-Funktion im Befehl von su

my_function() 
{ 
    do_something 
} 

su username -c "my_function" 

Das obige Skript funktioniert nicht. Natürlich ist my_function nicht innerhalb su definiert. Eine Idee, die ich habe, ist, die Funktion in eine separate Datei zu stellen. Hast du eine bessere Idee, die es vermeidet, eine andere Datei zu erstellen?

Antwort

11

können Sie die Funktion exportieren, um sie in die Subshell zur Verfügung zu stellen:

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

Sie könnten 'sudo' in Ihrem System aktivieren und stattdessen verwenden.

+0

sudo ist nicht aktiviert. Systemadministrator wird es nicht aktivieren. –

+2

Wie machst du das mit 'sudo'? Eine einfache 'sudo my_function' funktioniert nicht, selbst nach dem Export dieser Funktion. – michas

1

Sie müssen die Funktion in demselben Bereich haben, in dem Sie sie verwenden. Platzieren Sie die Funktion also entweder in den Anführungszeichen oder fügen Sie die Funktion in ein separates Skript ein, das Sie dann mit su -c ausführen.

+0

Ich möchte das gleiche Skript außerhalb su aufrufen. Das andere Skript war auch meine Idee. –

0

Eine weitere Möglichkeit, Fälle machen könnte und einen Parameter der ausgeführten Skript übergeben. Beispiel könnte sein: Zuerst erstellen Sie eine Datei namens "script.sh". Dann diesen Code einfügen darin:

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

Nach dem obigen Code Hinzufügen führen Sie diese Befehle in Aktion zu sehen:

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

Um diese Arbeit zu machen, wie Sie Sie benötigt werden müssen nur laufen

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

und alles sollte gut funktionieren. Hoffe, das hilft :)