Shell脚本:在其中使用sudo与在sudo中运行它?


13

在编写shell脚本时,其中的某些命令(而非全部)需要超级用户特权,我应该

  • 将sudo添加到需要超级用户特权的命令中,并在不使用sudo的情况下运行shell脚本,或者

  • 不要在需要超级用户权限的命令中添加sudo,而是使用sudo运行shell脚本?

第二种方式,我只需要提供一次密码,但是脚本中的所有命令都将以超级用户权限运行,包括那些不需要的命令。

第一种方式,我可能需要为不同的sudo命令多次提供密码,而超级用户特权仅授予那些需要它们的命令。

从安全性考虑,第一种方法更好。为了方便起见,第二种方法更好。

  1. 我一直在考虑采用第一种方法。因此,我不得不处理在shell脚本中为多个sudo命令提供密码的不便之处。

  2. 斯蒂芬·哈里斯(Stephen Harris)写道

    编写良好的脚本会检测它是否以正确的权限运行,而根本不会调用sudo,但是有很多错误的脚本

    那我应该用第二种方式吗?如果是这样的话,

    • 我怎么写“脚本将检测它是否以正确的权限运行,而根本不调用sudo”?

    • 我如何提高其安全性,以避免在使用sudo运行脚本时为不需要超级用户的命令赋予超级用户特权的问题?

  3. 这种简单的方法是否能兼具这两种方法的优点:将sudo添加到只需要它的命令中,然后根据需要的方便性或安全性运行带有或不带有sudo的脚本?这种方法有问题吗?

谢谢。


我以为sudo有默认的凭据缓存。您的平台上是否禁用了此功能?
管道

@pipe例如,他的脚本可能在一段时间内处于休眠状态,因此缓存可能无法正常工作。
LinuxSecurityFreak '18

Answers:


15

要解决您的第一个问题:

我怎么写“脚本将检测它是否以正确的权限运行,而根本不调用sudo”?

有一个简单的POSIX检查root:

#!/bin/sh
is_user_root ()
{
    [ "$(id -u)" -eq 0 ]
}

另外,在Bash中,更多由性能驱动的编码人员可能想要使用:

#!/bin/bash
is_user_root ()
{
    [ ${EUID:-$(id -u)} -eq 0 ]
}

请注意,我有意将代码包装在函数中以供重用。

解决第二个问题:

我如何提高其安全性,以避免在使用sudo运行脚本时为不需要超级用户的命令赋予超级用户特权的问题?

您对此无能为力。至少我什么都没想到。如果看到脚本,可能会有建议。但是由于您没有在问题中包括它...如果您使用sudo或as来运行整个脚本root,我认为没有办法控制它。

要发表评论:

您如何看待“在其中使用sudo与在sudo中运行它”

在我的脚本中,我通常采用后一种方法,但这并不一定意味着我向您推荐这种方法。因为这取决于脚本的目标对象- root仅用于;主要针对用户,但有些用户拥有sudo权限;您必须从字面上将脚本包含在问题中,以便我能够以任何值进行回答。


sudo -u "$SUDO_USER" command...
迈克尔·荷马'18

谢谢。您如何看待“在其中使用sudo与在sudo中运行它”?
蒂姆(Tim)

谢谢。这种简单的方法是否能兼具这两种方法的优点:将sudo添加到只需要它的命令中,然后根据需要的方便性或安全性运行带有或不带有sudo的脚本?这种方法有问题吗?
蒂姆(Tim)

@MichaelHomer我想知道sudo -u "$SUDO_USER" command这里的意思是什么?
蒂姆(Tim)

@Tim虽然我没有发现这种方法有任何问题,但有人可能会反对并提出合理的论据。这确实超出了您原始问题的范围。我现在需要每月进行一次M-Disc备份,所以我想今天还不能备份。我希望我至少回答了要点。明天见。
LinuxSecurityFreak '18

-4

我想我可以回答这个问题。

那我应该用第二种方式吗?

您没有理由在这里遇到问题,这就是为什么:

如果只有一个命令需要以root身份运行,则run您的程序为rootsudo因为sudo在脚本内需要更长的时间。您忘了程序员是懒惰的吗?

如果您需要许多命令run,请rootroot或运行sudo

我如何提高其安全性,以避免在使用sudo运行脚本时为不需要超级用户的命令赋予超级用户特权的问题?

如果其他用户需要run您的程序,则可sudo以为这些程序进行设置,因为它sudo是可自定义的,可以满足您的需求。

这是一个示例sudo

visudo在编辑sudoers文件时始终使用.....

kate ALL=(ALL) NOPASSWD: /usr/local/bin/script ARG1 ARG2

sudo 这对于更改程序/脚本内的用户也非常有用,这是我的脚本之一的一行:

sudo -i -u "$user" user="$user" CURRENTDIR="$CURRENTDIR" BASHRC="$BASHRC" bash <<'EOF'

我怎么写“脚本将检测它是否以正确的权限运行,而根本不调用sudo”?

https://www.cyberciti.biz/tips/shell-root-user-check-script.html
how-do-i-determine-if-a-shell-script-is-running-with-root-permissions

bash/sh:

#!/bin/bash
# (Use #!/bin/sh for sh)
if [ `id -u` = 0 ] 
then
        echo "I AM ROOT, HEAR ME ROAR"
fi

csh:

#!/bin/csh
if ( `id -u` == "0" ) 
then
        echo "I AM ROOT, HEAR ME ROAR"
endif

#!/bin/bash
if [[ $EUID -ne 0 ]]; then
  echo "You must be a root user" 2>&1
  exit 1
else
  mount /dev/sdb1 /mnt/disk2
fi

根据绅士@terdon的要求进行编辑:

以这种方式考虑您的脚本...。

它是公共脚本吗(您将使用的其他人除外)该脚本有什么作用?它告诉你时间吗?还是在200个系统上更新iptables?如果仅使用它,它是与工作/专业相关的还是个人使用的?

您只需要事先知道用户组的组成即可。

如果是written给予或出售给管理员,即使如此,为什么不应该script被允许以root?? 运行?它有什么害处?

真正的脚本/程序通常以特权用户身份运行,没有人提到那没问题,但是当程序员(大多数是像我这样的新手)谈论这些问题时,那就是真正的安全威胁........指的是试图说的,虽然不是很优雅,但有些人正在查看您对的控制system以及您的代码....您是否将文件设置为比将要使用的更多权限,您是否已进行所有检查逻辑还是才华横溢的程序员会一眼看到代码中的危险?

如果您code needs root使用sudo,并且有很多,只需将其运行为root.......我的答案就此结束


2
@somethingSomething您能否解释为什么即使只有一个命令需要root特权,还是建议始终以root用户身份运行脚本?您在回答中给出了两种可能性(一个命令需要root特权或多个),但是您对这两种情况都建议相同。
terdon

2
我已经考虑过这个问题,并阅读了其他类似的讨论。这个答案使我感到困惑。(但是,您已经有足够的否决票。)
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.