告诉用户是否在shell脚本中有SUed?

时间:2010-01-20 14:57:43

标签: shell zsh bash

我有一个脚本在我登录时执行git-pull。问题是,如果我对另一个用户说su并用su -lp保留我的环境,脚本会再次运行并且通常会被搞砸了各种原因,因为我是错误的用户。有没有办法在shell脚本中确定我目前是否正在申请?我正在寻找一种不涉及将用户名硬编码到脚本中的方法,这是我目前的解决方案。我使用Bash和ZSH作为shell。

5 个答案:

答案 0 :(得分:4)

您可以使用who命令的输出和id命令:

WHO=`who am i | sed -e 's/ .*//'`
ID_WHO=`id -u $WHO`
ID=`id -u`
if [[ "$ID" = "$ID_WHO" ]]
then
    echo "Not su"
else
    echo "Is su"
fi

答案 1 :(得分:0)

if test "$(id -u)" = "0"; 
  : # commands executed for root
else
  : # commands executed for non root
fi

答案 2 :(得分:0)

如果您使用suid可执行文件更改用户身份,那么您真实有效的用户ID将会有所不同。但是如果使用su(或sudo),它们都将被设置为新用户。这意味着调用getuid()或geteuid()的命令将无用。

更好的方法是检查谁正在运行脚本的终端。如果进程已从其终端分离,这显然不起作用,但除非脚本由守护程序运行,否则这不太可能。试试stat -c %U $(tty)。我相信who am i也会在大多数类Unix操作系统上做同样的事情。

答案 3 :(得分:0)

您可以使用“$ UID”环境变量。

如果其值为ZERO,则用户具有SUDO ed .. Bcos root为$ UID == 0

答案 4 :(得分:-2)

嗯......在linux上,如果我对其他用户说su进程su在新用户的进程列表中。

sudo ......不会为你留下这么愉快的事情。

我正在使用zsh ......但我不认为这是特定于shell的。

如果:

  

%ps | grep“su $”

返回任何内容,然后你在su'd shell中运行。

注意:su $之前有一个空格来排除以su结尾的命令。但是,不要防止任何名为su的自定义程序/脚本。