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

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

当编写一个 shell 脚本时,其中一些但不是全部命令需要超级用户权限,我应该

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

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

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

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

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

  1. 我一直在考虑采用第一种方式。所以我必须要解决在 shell 脚本中向多个 sudo 命令提供密码带来的不便。

  2. 斯蒂芬·哈里斯写道:

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

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

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

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

  3. 这种简单的方法是否可以兼具两种方法的优点:将 sudo 添加到只需要它的命令中,并根据我想要方便还是安全来运行带或不带 sudo 的脚本?这个方法有问题吗?

谢谢。

答案1

要解决您的第一个问题:

我怎么能写“脚本会检测它是否以正确的权限运行并且根本不调用 sudo”?

对 root 有一个简单的 POSIX 检查:

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

或者,在 Bash 中,更多注重性能的编码人员可能希望使用:

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

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

要解决您的第二个问题:

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

你对此无能为力。至少我什么也没想到。如果我看到剧本,我可能会有建议。但由于您没有将其包含在您的问题中...如果您使用sudoor as运行整个脚本root,我认为无法控制它。

针对评论:

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

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

答案2

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

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

你没有理由在这里遇到问题,原因如下:

如果只有一个命令需要以 root 身份运行,那么run您的程序为root或 ,sudo因为sudo在您的脚本中是更长的路。你忘了程序员都是懒惰的吗?

如果您需要许多命令runroot则将其运行为rootsudo

如何提高其安全性,以避免在使用 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
如何确定 shell 脚本是否正在使用 root 权限运行

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.......我的答案到此结束

相关内容