linux 在sudo调用的Bash脚本中标识用户

i34xakig  于 2023-06-05  发布在  Linux
关注(0)|答案(8)|浏览(366)

如果我创建的脚本/root/bin/whoami.sh包含:

#!/bin/bash
whoami

如果用户使用正确配置的sudo调用此脚本,它将指示

root

有没有一种快速的方法可以在脚本中获得实际的用户,或者我必须求助于沿着这个用户名的参数?

axkjgtzd

axkjgtzd1#

如果您使用的是sudo su -,则$SUDO_USER不起作用。
它还需要多次检查-如果$USER == 'root',则得到$SUDO_USER
使用who am i代替whoami命令。这将运行为当前会话过滤的who命令。它提供的信息比你需要的更多。所以,这样做只得到用户:

who am i | awk '{print $1}'

或者(更简单),您可以使用logname。它的作用与上面的语句相同。
这将为您提供登录到会话的用户名。
无论sudo还是sudo su [whatever],这些都可以工作。无论susudo被调用多少次,它都能正常工作。

a7qyws3x

a7qyws3x2#

我认为$SUDO_USER是有效的。

#!/bin/bash
echo $SUDO_USER
whoami
uxhixvfz

uxhixvfz3#

以下是如何获取调用脚本的人的用户名,无论是否sudo:

if [ $SUDO_USER ]; then user=$SUDO_USER; else user=`whoami`; fi

或者更短的版本

[ $SUDO_USER ] && user=$SUDO_USER || user=`whoami`
nwwlzxa7

nwwlzxa74#

使用whoamiwho am iwhoid$SUDO_USER在这里是不正确的。
实际上,who永远不会解决这个问题,因为它只会列出登录的用户,这可能是几十个。
在我看来,唯一有价值的答案就是使用logname
希望这个能帮上忙
罗伯

vsaztqbk

vsaztqbk5#

如果它是你正在寻找的UID(对docker恶作剧很有用),那么这个工作:

LOCAL_USER_ID=$(id -u $(logname))
dphi5xsq

dphi5xsq6#

who am i | awk '{print $1}'不适合我,但who|awk '{print $1}'将为我服务

4c8rllxm

4c8rllxm7#

奇怪的是,系统确实区分了real and effective UIDs,但我找不到在shell级别导出这个的程序。

vwkv1x7d

vwkv1x7d8#

在Rocky Linux 9.2中,我运行了这个脚本:

#!/bin/bash
echo "LOGNAME: $LOGNAME"
echo "SUDO_USER: $SUDO_USER"
set | grep username

在这些情景中的每一个中:

  • 作为用户(./script.sh
  • 登录名:用户名
  • SUDO_USER:null
  • 通过sudo(sudo ./script.sh)作为root用户
  • LOGNAME:root
  • SUDO_USER:用户名
  • 通过su(./script.sh)作为root用户
  • 登录名:用户名
  • SUDO_USER:null
  • 通过sudo su(./script.sh)作为root用户
  • LOGNAME:root
  • SUDO_USER:用户名

使用if...then...else检查是可行的,除非您无意中在superuser提示符下运行了sudo脚本:

#root: sudo ./script.sh
  • 通过su或sudo su,结果是
  • LOGNAME:root
  • SUDO_USER:root

但是,有一个set变量在我的所有场景中都是一致的:

MAIL=/var/spool/mail/username

我现在将登录用户设置为:

UNAME=$(echo $MAIL |cut -d/ -f5)

我相信有些情况下这是行不通的,但我还没有找到一个。

相关问题