如何检查在bash脚本中以root身份运行
我正在编写一个需要根级别权限的脚本,我想这样做,如果脚本不以root身份运行,它只会回应“请以root身份运行”。 并退出。
以下是我正在寻找的一些伪代码:
if (whoami != root) then echo "Please run as root" else (do stuff) fi exit
我怎么能最好(干净,安全)完成这个? 谢谢!
嗯,只是为了澄清:(做东西)部分将涉及运行命令,本身需要根。 所以像普通用户一样运行就会出错。 这只是为了干净地运行需要root命令的脚本,而不是在脚本中使用sudo,我只是在寻找一些语法糖。
$ EUID环境variables保存当前用户的UID。 Root的UID是0.在你的脚本中使用这样的东西:
if [ "$EUID" -ne 0 ] then echo "Please run as root" exit fi
在一个bash脚本中,你有几种方法来检查正在运行的用户是否是root用户。
作为警告 ,请不要使用root
用户名来检查用户是否为root
用户。 没有什么能保证ID为0的用户被称为root
。 这是一个非常强大的惯例,广泛遵循,但任何人都可以重命名超级用户的另一个名字。
我认为使用bash的最好方法是使用$EUID
,从手册页:
EUID Expands to the effective user ID of the current user, initialized at shell startup. This variable is readonly.
这是比$UID
更好的方法,可以改变它,而不是反映真正的用户运行脚本。
if (( $EUID != 0 )); then echo "Please run as root" exit fi
我遇到这种问题的一种方式是在不以root身份运行时在我的命令中注入sudo
。 这里是一个例子:
SUDO='' if (( $EUID != 0 )); then SUDO='sudo' fi $SUDO a_command
这样,我的命令在使用超级用户时由root运行,或者在由普通用户运行时由sudo
运行。
如果您的脚本总是以root身份运行,只需简单地设置权限( 0500
)即可。
正如@wrikken在他的评论中提到的, id -u
是一个更好的根检查。
另外,正确使用sudo
,你可以检查脚本是否以root身份运行。 如果没有,请通过sudo
重新启动,然后使用root权限运行。
根据脚本的作用,另一个选项可能是为脚本可能需要的任何专门命令设置一个sudo
条目。
if [[ $(id -u) -ne 0 ]] ; then echo "Please run as root" ; exit 1 ; fi
要么
if [[ `id -u` -ne 0 ]] ; then echo "Please run as root" ; exit 1 ; fi
🙂
已经给出了一些答案,但似乎最好的方法是使用:
-
id -u
- 如果以超级用户身份运行,将返回一个0。
这似乎比其他方法更可靠,而且即使脚本通过sudo
运行,它似乎也会返回一个0的ID。
有一个简单的检查用户是根。
[[ stuff ]]
语法是在bash中运行检查的标准方法。
error() { printf '\E[31m'; echo "$@"; printf '\E[0m' } if [[ $EUID -eq 0 ]]; then error "This script should not be run using sudo or as the root user" exit 1 fi
这也假设你想退出1,如果你失败。 error
函数是一些天赋,将输出文本设置为红色(不需要,但是如果你问我,就很漂亮)。
如果脚本确实需要root权限,那么它的文件权限应该反映出来。 有一个非root用户可以执行的root脚本将是一个红旗。 我鼓励你不要用if
检查来控制访问。
chown root:root script.sh chmod u=rwx,go=r script.sh
非常简单的方法就是:
if [ "$(whoami)" == "root" ] ; then # you are root else # you are not root fi
使用这个而不是id
的好处是你可以检查某个非root用户是否也在运行这个命令。 例如。
if [ "$(whoami)" == "john" ] ; then # you are john else # you are not john fi
尝试下面的代码:
if [ "$(id -u)" != "0" ]; then echo "Sorry, you are not root." exit 1 fi
要么
if [ `id -u` != "0" ]; then echo "Sorry, you are not root." exit 1 fi
0-阅读官方的GNU Linux文档,有很多方法可以正确地做到这一点。
1-确保你把shell签名,以避免在解释中的错误:
#!/bin/bash
这是我的剧本
#!/bin/bash if [[ $EUID > 0 ]]; then # we can compare directly with this syntax. echo "Please run as root/sudo" exit 1 else #do your stuff fi
id -u
比whoami
好得多,因为像android这样的系统可能不会提供root这个词。
例:
# whoami whoami whoami: unknown uid 0
检查根目录,如果失败则退出:
func_check_for_root() { if [ ! $( id -u ) -eq 0 ]; then echo "ERROR: $0 Must be run as root, Script terminating" ;exit 7 fi } func_check_for_root
然后还有whoami和'我是谁',如果你想知道谁在脚本谁正在运行一个脚本:
it@it-ThinkPad-W510:~$ who am i it pts/19 2014-06-03 12:39 (:0.0) it@it-ThinkPad-W510:~$ sudo who am i [sudo] password for it: it pts/19 2014-06-03 12:39 (:0.0)
(请参阅即使使用sudo调用它给用户id)
it@it-ThinkPad-W510:~$ sudo whoami root
因此,
if [ "$(whoami)" == "user" ]; then echo "Executing the installer script" else echo "user is only allowed to execute the installer script" fi
使脚本只能以root运行的一种简单方法是使用以下行来启动脚本:
#!/bin/su root