Linux shell脚本中的su和sudo

Linux shell脚本中的su和sudo,linux,shell,sudo,su,Linux,Shell,Sudo,Su,有一个shell脚本(/bin/sh,而不是bash)需要root权限才能执行 如果它是由普通用户运行的,它应该向用户请求一个密码以获得root访问权限,然后重新运行它自己 现在它使用以下代码: if[$(id-u)-ne 0];然后是su根--$0$@。。。fi 这很好,但是有些操作系统,比如Ubuntu,根本没有根密码。另一方面,许多系统使用sudo来获得根权限 问题是:脚本如何检测是否使用su或sudo,而不要求用户输入太多密码(例如,如果输入sudo密码失败-运行su)。您可以在/etc

有一个shell脚本(/bin/sh,而不是bash)需要root权限才能执行

如果它是由普通用户运行的,它应该向用户请求一个密码以获得root访问权限,然后重新运行它自己

现在它使用以下代码:

if[$(id-u)-ne 0];然后是su根--$0$@。。。fi

这很好,但是有些操作系统,比如Ubuntu,根本没有根密码。另一方面,许多系统使用sudo来获得根权限


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

您可以在/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)

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

检查是否安装了
sudo
ist

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

虽然这并不能完全回答您的问题,但值得注意的是,您可以使用以下方法检查是否安装了sudo软件包:

基于Debian的系统:

dpkg -s sudo
rpm -q sudo
基于RPM的系统:

dpkg -s sudo
rpm -q sudo

不应该。若脚本需要root权限,则应以root身份运行。如何实现这一点是用户的事情——使用su、sudo或其他机制


如果您担心安全问题,不想从根目录执行所有操作,则可以删除这些部分的根目录权限。

从此文件中再创建一个.sh文件调用原始的
.sh
文件,如-

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

这个脚本是一种安装程序——我不在我的主机上运行它,但其他用户在他们的机器上运行它。第二部分呢?提前退出并提示他们以root身份运行脚本。这是旧版本中使用的代码。现在,我试图从脚本中获取root权限,这样用户就不必重新启动它。似乎是一个多一点的用户-friendly@zserge:您可能会提示用户-“1:su到root并继续(您需要root密码;2:使用sudo运行脚本(如果允许);3:中止安装”一个不错的方法。但是:机器上可以安装sudo,但是用户没有使用sudo运行此脚本的权限。这没关系,因为这样,sudo将失败,而不需要询问密码,您可以调用
su
(只需观察
sudo true
的结果)。也许我错了,但虽然允许用户运行true,但不能保证他可以运行我们的脚本。而且,如果允许用户使用密码运行程序,则在执行
sudo true
时会提示他。我尝试避免不必要的密码提示。好的,
sudo true
是垃圾。请确保脚本返回0(true)然后,用户只被询问一次,如果他不能使用你的脚本,你就会知道,因为返回值,所以你可以调用
su
。我看不出更好的方法了,但这仍然需要询问用户的密码,然后可能还要问根密码:avoiding这就是问题所在。gentoo、arch或slackware用户呢?在我看来,
哪个sudo
是测试程序是否安装的更通用的方法。就这一点而言,Free/Open/Net BSD、macOS、Illumos、HP/UX、Android、webOS呢?如果你必须依赖某些东西,依赖POSIX.1。当然不是特定于平台的软件包g tools.
hash somebinary
也是一种很好的查找二进制文件的方法,特别是当您打算再次调用二进制文件时,因为它会缓存路径以加快执行速度,但是如果您预期会出现故障并且只需要退出代码,则可能需要将所有输出重定向到/dev/null。zserge下面的注释解释了这一点“这是旧版本中使用的代码。现在我正试图从[installation]脚本中获得root权限,这样用户就不必重新启动它。似乎更方便用户。”这似乎是一个公平的问题,而不是天生的邪恶;-)@Tony:我的观点是,它一点也不友好。这是一个试图比用户更聪明的例子。在某些情况下,这可能会起作用,但更可能给用户带来问题。此外,你应该遵循最小惊喜的原则。我会感到惊讶(并且会向作者提出一些问题)如果某个程序未经我同意就试图使用sudo获取root权限。