如何在 shell 脚本中以 root 身份运行函数

如何在 shell 脚本中以 root 身份运行函数

我想制作一个脚本并将其添加到快捷方式启动器...
当我双击图标时,它会弹出一个终端窗口(完成)

在终端中,它会首先要求输入 root 密码,然后以 root 权限执行一些操作(我想将其作为一项功能)。

之后,在脚本的末尾,它会像“按任意键关闭窗口”一样关闭窗口(我可以做到)

#!/bin/sh
touchpad(){
    whoami
}
sudo -S touchpad # but it return error "command not found"

如何以 root 用户身份运行某个功能或者是否有其他方法来实现这一点?

编辑 :
我已经尝试过这个#!/bin/bash

sudo ./main2.sh #this did not work when I made it as a launcher
exit 

这是我当前的代码(经过谷歌搜索):

#!/bin/bash

gksudo -m "Input Password" clear
sudo whoami
#sudo bla bla bla
read -n 1 -p "Press any key to close window"

这就是我想要的,但是当我输入错误密码 3 次时会出现错误。如果 gksudo 失败,如何强制退出主窗口?

答案1

测试gksudo的返回值:

if ! gksudo -m "Input Password" clear ; then
    echo Bad password
    exit 1
fi

答案2

依我之见...最简单的方法是以 root 身份运行整个脚本,而不必记住它需要以 root 身份运行它似乎应该可以完成您想要完成的任务

#!/bin/bash
dScript=$0
if [[ ${UID} -gt 0 ]] ; then
    sudo ${dScript}
    exit
fi
### the rest of your script

答案3

你不能。要做到这一点,你需要将该函数放在另一个脚本中,然后使用 sudo 运行该脚本。

Sudo 仅运行命令,无法访问脚本中的函数,因为它在单独的进程中运行。如果您坚持要在脚本中运行某个函数,则可以使用 sudo 再次运行该脚本,但向其传递一个参数,该参数将$1直接运行该函数。

答案4

你确实可以这样做:

假设您以 root 用户身份登录,并且想要为 root 以外的其他用户运行某个功能,则可以export -f在脚本中使用该功能的选项。例如:

#!/usr/local/bin/bash

user="${SUDO_USER:-$USER}"
whomomlikes(){
   echo "Hello!! $(whoami)";
}
main()
{
  export -f whomomlikes;
  su $user -c "bash -c whomomlikes";
}
main;

这并不意味着它只适用于导出的函数,如果您在其他函数中声明了变量,那么您必须以类似的方式导出它们,然后相应地运行它们。

相关内容