Выполнение функции bash в команде su

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

my_function()
{
  do_something
}

su username -c "my_function"

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

Ответ 1

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

export -f my_function
su username -c "my_function"

Ответ 2

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

Ответ 3

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

Ответ 4

Другой способ - это сделать случаи и передать параметр исполняемому script. Пример может быть: Сначала создайте файл под названием "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

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

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

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

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

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