我正在关注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}
这将打印root
forsudo some command
和some_user
for sudo -u some_user some command
。
但请注意,该解决方案有一些限制:
- 例如,有些情况没有涵盖
sudo --user=some_user ...
。我认为进一步增强脚本相当容易awk
。 - 由于它依赖于
history
,因此它无法使用 中没有的命令history
,例如,在使用HISTCONTROL=ignoreboth
和发出前面带有空格的命令时。
答案2
打印有效用户 ID (euid)
/bin/id -u