如果不是 root,如何阻止脚本运行(并回显“未以 root 身份运行!正在退出...”)

如果不是 root,如何阻止脚本运行(并回显“未以 root 身份运行!正在退出...”)

这是我的来源:

#!/bin/bash

echo "Running script to free general cached memory!"
echo "";
echo "Script must be run as root!";
echo "";
echo "Clearing swap!";
swapoff -a && swapon -a;
echo "";
echo "Clear inodes and page file!";
echo 1 > /proc/sys/vm/drop_caches;
echo "";

它会清除缓存和其他内容,并表明它需要在终端中以 root 身份运行。我基本上只是希望脚本在检测到它没有以 root 身份执行时停止运行。

例子:

"Running script to free general cached memory!"
"Warning: script must be run as root or with elevated privileges!"
"Error: script not running as root or with sudo! Exiting..."

如果以提升的权限运行,它就会正常运行。有任何想法吗?谢谢!

答案1

#!/bin/sh

if [ "$(id -u)" -ne 0 ]; then
        echo 'This script must be run by root' >&2
        exit 1
fi

cat <<HEADER
Host:          $(hostname)
Time at start: $(date)

Running cache maintenance...
HEADER

swapoff -a && swapon -a
echo 1 >/proc/sys/vm/drop_caches

cat <<FOOTER
Cache maintenance done.
Time at end:   $(date)
FOOTER

root 用户的 UID 为 0(无论“root”帐户的名称是什么)。如果返回的有效 UIDid -u不为零,则用户未以 root 权限执行脚本。用于id -ru测试真实ID(用户的UID)调用剧本)。

不要$EUID在脚本中使用,因为非特权用户可能会修改它:

$ bash -c 'echo $EUID'
1000

$ EUID=0 bash -c 'echo $EUID'
0

如果用户这样做,显然不会导致权限升级,但可能会导致脚本中的命令无法执行其应该执行的操作以及使用错误的所有者创建文件等。

答案2

我认为你想要的是检查你是否具有超级用户权限,即你的有效用户id是否为0。

zshbash使其在$EUID变量中可用,这样您就可以执行以下操作:

if ((EUID != 0)); then
  echo >&2 "Error: script not running as root or with sudo! Exiting..."
  exit 1
fi

对于任何类似 POSIX 的 shell,您可以使用id标准命令:

if [ "$(id -u)" -ne 0 ]; then
  echo >&2 "Error: script not running as root or with sudo! Exiting..."
  exit 1
fi

请注意,所有id -unwhoami$USERNAME中的变量zsh将为您提供第一的uid 的用户名。在其他用户的 id 为 0 的系统上,root即使该进程是已验证为 的进程的后代,也可能不是root

$USER通常给你经过身份验证的用户,但依赖它是相当脆弱的。它不是由 shell 设置的,但通常由身份验证命令设置(例如loginsu(在 GNU/Linux 系统上,不一定是其他系统),,sudosshd至少来自 openssh 的命令)...)。但情况并非总是如此(更改 uid 不会自动设置该变量,它必须由应用程序更改 uid 显式完成),并且它也可能已被 shell 祖先中的其他进程修改。$LOGNAME,同样的警告更可靠,因为它是由 POSIX 指定的(最初来自 FIPS 151-2)

答案3

您可以使用$USERwhoami来检查当前用户。

if [[ "$USER" != "root" ]]; then
    echo "Error: script not running as root or with sudo! Exiting..."
    exit 1
fi

if [[ $(whoami) != "root" ]]; then
    echo "Warning: script must be run as root or with elevated privileges!"
    exit 1
fi

if [[ $(id -u) != "0" ]]; then
    echo "Error: script not running as root or with sudo! Exiting..."
    exit 1
fi

答案4

您真正想要的是确定您是否有权执行这些操作。检查你是否是 root 来代替它被认为是不好的做法。

如果系统已配置为允许非 root 用户修改交换和删除页面缓存,为什么该用户不应该运行您的脚本?

相反,您可以简单地尝试该操作,如果失败,则退出并显示有用的消息:

if ! ( swapoff -a && swapon -a )
then
  echo "Failed to clear swap (rerun as root?)" >&2
  exit 1
fi

if ! echo 1 > /proc/sys/vm/drop_caches
then 
  echo "Failed to free page cache (rerun as root?)" >&2
  exit 1
fi

相关内容