问题 在su的命令中运行bash函数


在我的bash脚本中,我以另一个用户身份执行一些命令。我想用bash函数调用 su

my_function()
{
  do_something
}

su username -c "my_function"

上面的脚本不起作用。当然, my_function 里面没有定义 su。我的一个想法是将函数放入一个单独的文件中。你有更好的想法,避免制作另一个文件?


6672
2017-09-16 11:30


起源



答案:


您可以导出该函数以使其可用于子shell:

export -f my_function
su username -c "my_function"

12
2017-09-16 14:19





您可以在系统中启用“sudo”,然后使用它。


2
2017-09-16 11:40



sudo未启用。系统管理员不会启用它。 - Attila Zobolyak
你是怎么做到这一点的 sudo?一个简单的 sudo my_function 即使在导出该功能后也无法工作。 - michas


答案:


您可以导出该函数以使其可用于子shell:

export -f my_function
su username -c "my_function"

12
2017-09-16 14:19





您可以在系统中启用“sudo”,然后使用它。


2
2017-09-16 11:40



sudo未启用。系统管理员不会启用它。 - Attila Zobolyak
你是怎么做到这一点的 sudo?一个简单的 sudo my_function 即使在导出该功能后也无法工作。 - michas


您必须在使用它的同一范围内具有该功能。因此,要么将函数放在引号内,要么将函数放到单独的脚本中,然后使用su -c运行。


1
2017-09-16 11:41



我想在su之外调用相同的脚本。另一个脚本也是我的想法。 - Attila Zobolyak


另一种方法是制作案例并将参数传递给执行的脚本。 示例可以是: 首先创建一个名为“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'

一切都应该工作正常。 希望这可以帮助 :)


0
2017-09-16 15:17