2010-10-04 69 views
6

有一个shell脚本(/ bin/sh,而不是bash),它需要root权限才能执行。su和sudo在shell脚本中

如果它是由普通用户运行的,它应该询问用户密码以获得root访问权限并重新运行自己。

现在使用下面的代码:

if [ $(id -u) -ne 0 ]; then su root -- $0 [email protected] ; ... fi

这工作正常,但也有一些像Ubuntu操作系统,没有root密码的。另一方面,许多系统使用sudo来获得root权限。

的问题是:如何能脚本检测是否使用susudo而不要求用户输入过多的密码(例如,输入密码sudo,如果失败 - 运行su)。

回答

3

这样做没有防弹的方法,因为任何发行版都可以以任何想要的方式放置文件。例如,Debian和Ubuntu通常会将系统文件放在Red Hat以外的目录中。为其安装的操作系统定制脚本要容易得多。

2

您可以设置帐户不是需要在/ etc/sudoers文件sudo的密码:

yourusername ALL=(ALL) NOPASSWD: ALL 

如果你不想这样做,你可以迫使他们运行脚本以root身份。加入这样的事情你的shell脚本的顶部:

if [ "$UID" -ne 0 ]; then 
    echo "You must be root to run this script" 
    exit 1 
fi 

通过这种方式,用户可以得到root权限但他们选择(su或sudo的)。

+0

这个脚本是一种安装的 - 我不会在我的主机上运行它,但其他用户在运行他们的机器。 – zserge 2010-10-04 15:10:58

+0

第二部分呢?提前退出并提示他们以root用户身份运行脚本。 – gpojd 2010-10-04 15:12:40

+0

这是旧版本中使用的代码。现在我试图从脚本获得root权限,所以用户不必重新启动它。似乎是一个更方便用户 – zserge 2010-10-04 15:36:24

0

检查sudo IST安装

SU='su' 
which sudo > /dev/null && SU='sudo' 
+0

一个不错的方法,但是:可以在机器上安装sudo,但用户没有权限使用sudo运行此脚本。 – zserge 2010-10-04 15:23:30

+0

这并不重要,因为sudo将会失败,并且不会询问密码,并且你可以调用'su'来代替(只是观察'sudo true'的结果) – bitmask 2010-10-04 15:31:31

+0

也许我错了,但是当用户被允许运行时,它不能保证他能运行我们的脚本,并且,如果允许用户用密码运行程序,执行'sudo true'时会提示,我试图避免不需要的密码提示 – zserge 2010-10-04 15:39:47

0

虽然这并不能完全回答你的问题,这是值得注意的是,您可以检查是否正在使用下面的安装sudo包:

基于Debian的系统:

dpkg -s sudo 

基于RPM的系统:

rpm -q sudo 
+1

那么gentoo,arch或slackware用户呢?在我看来,'哪个sudo'是测试程序是否安装的更一般的方法。 – zserge 2010-10-04 15:41:32

+0

就此而言,Free/Open/Net BSD,macOS,Illumos,HP/UX,Android,webOS如何?如果你必须依靠某些东西,依靠POSIX.1。当然不是平台特定的打包工具。 – ghoti 2017-06-08 12:18:44

+0

'hash somebinary'也是查找二进制文件的好方法,尤其是如果您要在快速执行时缓存路径时再次调用二进制文件,但是如果您需要将所有输出重定向到/ dev/null期望失败,只想要退出代码。 – dragon788 2017-11-17 18:52:16

6

它不应该。如果脚本需要root权限,它应该以root身份运行。用户的业务是如何实现的 - 使用su,sudo或其他机制。

如果您关心安全问题并且不想从根开始执行所有操作,则可以删除这些部分的root权限。

+0

zserge的下面的评论解释了“那是旧版本中使用的代码,现在我试图从[安装]脚本获得root权限,所以用户不必重新启动它。似乎是一个更多的用户-友善”。似乎是一个问题的公平基础,而不是天生的邪恶;-)。 – 2010-10-05 03:07:10

+0

@Tony:我的观点是,它不*用户友好。这是一个试图比用户更聪明的例子。在某些情况下,这可能会起作用,但是更有可能导致用户出现问题。你也应该遵循最少惊喜的原则。如果某些程序在未经我的同意的情况下尝试使用sudo获取root权限,我会感到惊讶(并且会对作者提出一些问题)。 – 2010-10-05 06:02:47

1

从该文件中创建一个更sh文件调用您的原始.sh文件一样 -

su - oracle /u01/enlightics/Enlightiks/UploadFTP/ExportScript2.sh