如何使用 bash 脚本确定是否以 root/sudo 身份运行脚本/命令

如何使用 bash 脚本确定是否以 root/sudo 身份运行脚本/命令

我正在关注https://lifehacker.com/add-a-handy-separator- Between-commands-in-your-terminal-5840450在 Linux 终端的命令之间创建一个漂亮的分隔符。具体来说,CentOS 8。

我正在尝试修改脚本以输出运行该命令的用户的用户名。

这里这是我想出的。

# Fill with minuses
# (this is recalculated every time the prompt is shown in function prompt_command):
fill="--- "

reset_style='\[\033[00m\]'
if [ -z "$VIM" ];
then status_style=$reset_style'\[\033[0;90m\]' # gray color; use 0;37m for lighter color
else status_style=$reset_style'\[\033[0;90;107m\]'
fi
prompt_style=$reset_style
command_style=$reset_style'\[\033[1;29m\]' # bold black
# Prompt variable:

OLD_PS1="$PS1"
PS1="$status_style"'$fill $USER \t\n'"$prompt_style$OLD_PS1$command_style"

# Reset color for command output
# (this one is invoked every time before a command is executed):
trap 'echo -ne "\e[0m"' DEBUG


function prompt_command {

    # create a $fill of all screen width minus the time string and a space and USER and a space:
    let fillsize=${COLUMNS}-10-${#USER}
    fill=""
    while [ "$fillsize" -gt "0" ]
    do
        fill="-${fill}" # fill with underscores to work on 
        let fillsize=${fillsize}-1
    done

    # If this is an xterm set the title to user@host:dir
    case "$TERM" in
    xterm*|rxvt*)
        bname=`basename "${PWD/$HOME/~}"`
        echo -ne "\033]0;${bname}: ${USER}@${HOSTNAME}: ${PWD/$HOME/~}\007"
        ;;
    *)
        ;;
    esac

}
PROMPT_COMMAND=prompt_command

第 15$USER行在生成的内容中添加了“ ”和。

第 25 行更改为包含额外的空格和变量的长度$USER

看起来就像我想要的那样。

终端截图

但是,如果我运行命令或不运行命令,我想更新要输出的代码sudo。理想情况下,它将名称更改为 root 或任何 root 用户名。

我尝试了几件事,主要是尝试使用,whoami但这总是返回我的用户名而不是 root。如果我运行,sudo whoami我会获得root权限,但不是从脚本中获得root权限。我也尝试过EUID没有骰子。

此时,我已将代码保留在工作状态并带有$USER参考,但我愿意将其更改为所需的任何内容。

解决方案提供者u/pLumo

解决方案的局限性:

  • 有些情况没有涵盖,例如 sudo --user=some_user .... 我认为进一步增强 awk 脚本相当容易。
  • 由于它依赖于历史记录,因此它不适用于历史记录中没有的命令,例如,当使用 HISTCONTROL=ignoreboth 并发出前面带有空格的命令时。
# Fill with minuses
# (this is recalculated every time the prompt is shown in function prompt_command):
fill="--- "

reset_style='\[\033[00m\]'
if [ -z "$VIM" ];
then status_style=$reset_style'\[\033[0;90m\]' # gray color; use 0;37m for lighter color
else status_style=$reset_style'\[\033[0;90;107m\]'
fi
prompt_style=$reset_style
command_style=$reset_style'\[\033[1;29m\]' # bold black
# Prompt variable:

OLD_PS1="$PS1"
PS1="$status_style"'$fill $name \t\n'"$prompt_style$OLD_PS1$command_style"

# Reset color for command output
# (this one is invoked every time before a command is executed):
trap 'echo -ne "\e[0m"' DEBUG


function prompt_command {

    # create a $fill of all screen width minus the time string and a space and USER and a space:
    name=$(fc -l -1 | awk -v u="$USER" '{if ($2=="sudo") { if ($3=="-u") u=$4; else u="root"; }; printf "%s",u}')
    let fillsize=${COLUMNS}-10-${#name}
    fill=""
    while [ "$fillsize" -gt "0" ]
    do
        fill="-${fill}" # fill with underscores to work on 
        let fillsize=${fillsize}-1
    done

    # If this is an xterm set the title to user@host:dir
    case "$TERM" in
    xterm*|rxvt*)
        bname=`basename "${PWD/$HOME/~}"`
        echo -ne "\033]0;${bname}: ${USER}@${HOSTNAME}: ${PWD/$HOME/~}\007"
        ;;
    *)
        ;;
    esac

}
PROMPT_COMMAND=prompt_command

终端输出 - 解决方案

答案1

prompt_command不知道哪个用户运行了最后一个命令。prompt_command始终由普通用户会话运行。

作为解决方法。您可以阅读并解析history.

例如:用于fc -l -1打印最后一个命令awk ...并解析它。


在线#15更改$USER$name

在行中#23添加以下内容:

name=$(fc -l -1 | awk -v u="$USER" '{if ($2=="sudo") { if ($3=="-u") u=$4; else u="root"; }; printf "%s",u}')

在线#25${#USER}改为${#name}


这将打印rootforsudo some commandsome_userfor sudo -u some_user some command

但请注意,该解决方案有一些限制:

  • 例如,有些情况没有涵盖 sudo --user=some_user ...。我认为进一步增强脚本相当容易awk
  • 由于它依赖于history,因此它无法使用 中没有的命令history,例如,在使用HISTCONTROL=ignoreboth和发出前面带有空格的命令时。

答案2

打印有效用户 ID (euid)

/bin/id -u

相关内容