Вопрос

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

my_function()
{
  do_something
}

su username -c "my_function"

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

Это было полезно?

Решение

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

export -f my_function
su username -c "my_function"

Другие советы

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

Вы должны иметь функцию в том же объеме, где вы его используете. Поэтому либо поместите функцию внутри цитаты, либо поместите функцию в отдельный скрипт, который вы запускаете с SU -C.

Еще один способ сделать случаи и передавать параметр на выполненный скрипт. Пример может быть: сначала сделайте файл под названием «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'

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top