Запуск функции bash по команде su - PullRequest
13 голосов
/ 16 сентября 2010

В моем скрипте bash я выполняю некоторые команды от имени другого пользователя.Я хочу вызвать функцию bash, используя su.

my_function()
{
  do_something
}

su username -c "my_function"

Вышеуказанный скрипт не работает.Конечно, my_function не определено внутри su.У меня есть одна идея - поместить функцию в отдельный файл.У вас есть идея получше, чтобы избежать создания другого файла?

Ответы [ 4 ]

14 голосов
/ 16 сентября 2010

Вы можете экспортировать функцию, чтобы сделать ее доступной для подоболочки:

export -f my_function
su username -c "my_function"
2 голосов
/ 16 сентября 2010

Вы можете включить «sudo» в своей системе и использовать его вместо этого.

1 голос
/ 16 сентября 2010

Вы должны иметь функцию в той же области, где вы ее используете. Так что либо поместите функцию в кавычки, либо поместите функцию в отдельный скрипт, который вы затем запустите с помощью su -c.

0 голосов
/ 16 сентября 2010

Другим способом может быть создание обращений и передача параметра в исполняемый скрипт.Примером может быть: Сначала создайте файл с именем «script.sh».Затем вставьте в него этот код:

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

После добавления приведенного выше кода выполните следующие команды, чтобы увидеть его в действии:

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

Чтобы сделать эту работу, как вам нужно, вы простонужно запустить

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

и все должно работать нормально.Надеюсь, это поможет:)

...