Bash脚本:要求脚本以root身份(或使用sudo)运行


26

我正在尝试编写bash脚本(在Ubuntu中),该脚本将使用tar备份目录。

如何在脚本中进行检查,使其只能以root身份(或使用sudo)运行?

例如,如果用户运行该脚本,则应说该脚本必须以sudo特权运行,然后退出。如果脚本以root身份执行,它将继续通过检查。

我知道必须有一个简单的解决方案,但我只是无法通过谷歌搜索找到它。

Answers:


37

要提取有效的uid,请使用以下命令:

id -u

如果结果为“ 0”,则脚本以root身份或使用sudo运行。您可以通过执行以下操作来运行检查:

if [[ $(/usr/bin/id -u) -ne 0 ]]; then
    echo "Not running as root"
    exit
fi

5
我建议完全限定id的路径(例如/ usr / bin / id)。否则,欺骗的用户可以编写自己的脚本/二进制文件,该脚本/二进制文件始终返回0,然后将其放在执行用户的路径中较早的位置。
ktower

同意 通过编辑修复。
Scott Pack

6
您使用id的完整路径不会阻止任何试图“运行”脚本的人。
theotherre

我同意另一个...这是一个bash脚本。符合条件的“ id”箱将不会阻止任何认真地想绕开支票的人。最好不要将其保留为可移植性。
克里斯,2009年

1
这不能解决“ sudo”的要求。
GregB 2012年

17

我假设您知道通过将所有权更改为root

chown root:root file

并将权限设置为700

chmod 700 file

您将完成相同的操作-无需建议以sudo身份运行。

但我会将此答案发布完整。


3
这是比接受的答案更合适的解决方案。-我的$ 0.02
克里斯(Chris)2009年

旁注:将脚本检入git变得更加困难。要解决,sudo git add <file>
Chaim Eliyah '16

2

您的目的是为了通知用户他们应该以root用户身份或某种安全预防措施运行脚本?

如果您只是想告知用户,任何uid建议都可以,但是作为安全预防措施,它们就像骑轮胎一样有用-阻止用户复制脚本,删除if语句,没有什么阻止任何事情,并继续运行它。

如果这是安全问题,则应将脚本设置为root:root拥有的700,以便其他任何用户都不可读或可执行。


或者,可能是脚本需要访问只有root才能访问的文件或命令才能执行其工作,例如在我的情况下
chrisbunney 2011年

2

您也可以使用whoami命令。

if [ ! "`whoami`" = "root" ]
then
    echo "\nPlease run script as root."
    exit 1
fi

实际上,uid 0是具有完全特权的特殊用户帐户。“ root”只是映射到该UID的最常见的标签/名称。它不具备成为“根”,且攻击者可能会试图利用这一点。
0xSheepdog '16

2

bash变量$EUID显示脚本运行所在的有效UID,如果要确保脚本以root身份运行,请检查是否$EUID包含值0:

if [ $EUID -ne 0 ]; then
    echo "$0 is not running as root. Try using sudo."
    exit 2
fi

这比使用/usr/bin/id(对于bash脚本!)的解决方案更好,因为它不需要外部命令。


1
而不是仅仅退出,可以通过更换提示须藤登录用户echo与线sudo "$0" "$@",并更换exit 2exit $?
schumacher574 2015年

好主意。但是这个问题要求脚本退出,而不是自己运行sudo。
neuhaus

0

使脚本只能由root用户运行的一种简单方法是使用以下行启动脚本:
#!/bin/su root


-1

“#!/ bin / su root”允许处于超级用户模式的用户无需使用root密码即可运行脚本。如果您希望超级用户以root的结果运行脚本,则可以这样做。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.