首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >shell脚本:在里面使用sudo,还是使用sudo运行它?

shell脚本:在里面使用sudo,还是使用sudo运行它?
EN

Unix & Linux用户
提问于 2018-11-01 04:40:49
回答 2查看 8.9K关注 0票数 15

在编写shell脚本时,其中的某些命令(但不是所有命令)都需要超级用户权限,我是否可以

  • 向那些需要超级用户特权的命令中添加sudo,然后运行没有sudo的shell脚本,或者
  • 不要在那些需要超级用户特权的命令中添加sudo,而是使用sudo运行shell脚本?

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

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

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

  1. 我一直在考虑采用第一种方式。所以我必须要处理为shell脚本中的多个sudo命令提供密码带来的不便.
  2. 斯蒂芬·哈里斯:一个写得很好的脚本会检测它是否具有正确的权限运行,而根本没有调用sudo,但是有很多不好的脚本,所以我应该使用第二种方式吗?如果是,
    • 我如何编写“脚本将检测它是否以正确的权限运行,而根本不调用sudo”?
    • 如何改进它的安全性,以避免在使用sudo运行脚本时将超级用户权限授予不需要它们的命令的问题?

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

谢谢。

EN

回答 2

Unix & Linux用户

发布于 2018-11-01 05:23:44

为了解决你的第一个问题:

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

根有一个简单的POSIX检查:

代码语言:javascript
运行
复制
#!/bin/sh
is_user_root ()
{
    [ "$(id -u)" -eq 0 ]
}

或者,在Bash中,更多性能驱动的编码器可能希望使用:

代码语言:javascript
运行
复制
#!/bin/bash
is_user_root ()
{
    [ "${EUID:-$(id -u)}" -eq 0 ]
}

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

为了解决你的第二个问题:

如何改进它的安全性,以避免在使用sudo运行脚本时将超级用户权限授予不需要它们的命令的问题?

你不能对此做太多。至少我什么都没想过。如果我看到剧本,我可能会有建议。但既然你没有把它包括在你的问题里..。如果您使用sudoroot运行整个脚本,我看不出有什么办法控制它。

为了回应这一评论:

你认为“在它里面使用sudo与使用sudo运行它”怎么样?

在我的脚本中,我通常采用后一种方法,但这并不一定意味着我推荐给您。因为这取决于脚本是为谁设计的--只针对root;对于用户(除了一些拥有sudo权限的用户之外);您必须将脚本真正地包含在这个问题中,这样我才能用任何值来回答。

票数 16
EN

Unix & Linux用户

发布于 2018-11-01 07:16:58

我想我能回答这个问题。

所以我应该用第二种方式吗?

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

如果只有一个命令需要作为根用户运行,那么将您的程序作为runsudo运行,因为脚本中的sudo是一条更长的路。Have你忘了程序员是懒惰的?

如果您需要许多命令,run作为root,然后以rootsudo的形式运行它。

如何改进它的安全性,以避免在使用sudo运行脚本时将超级用户权限授予不需要它们的命令的问题?

如果其他用户需要run您的程序,那么为这些用户设置sudo,因为sudo是大量可定制的,并将满足您的需求。

下面是sudo的一个示例:

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

代码语言:javascript
运行
复制
kate ALL=(ALL) NOPASSWD: /usr/local/bin/script ARG1 ARG2

sudo对于改变程序/脚本中的用户也是很好的,下面是我的一个脚本中的一行:

代码语言:javascript
运行
复制
sudo -i -u "$user" user="$user" CURRENTDIR="$CURRENTDIR" BASHRC="$BASHRC" bash <<'EOF'

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

https://www.cyberciti.biz/tips/shell-root-user-check-script.html undefined

代码语言:javascript
运行
复制
bash/sh:

#!/bin/bash
# (Use #!/bin/sh for sh)
if [ `id -u` = 0 ] 
then
        echo "I AM ROOT, HEAR ME ROAR"
fi
代码语言:javascript
运行
复制
csh:

#!/bin/csh
if ( `id -u` == "0" ) 
then
        echo "I AM ROOT, HEAR ME ROAR"
endif
代码语言:javascript
运行
复制
#!/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个系统上的iptable?如果你只使用它,它是与工作/专业相关的,还是用于个人用途?

You只需事先知道您的用户组由什么组成,就是这样。

如果给或卖给管理员的是written,那么为什么不允许script作为root运行呢?会有什么害处呢?

真正的脚本/程序通常以特权用户的身份运行,没有人提到这没有问题,但是当程序员(主要是像我这样的新手)谈论这些事情时,这才是真正的安全威胁……在你的帖子中,你提到的那个人试图说的是,有些人看了控件,你的system和你的代码.您是否将文件设置为比您将要使用的权限更多的权限,您的逻辑中是否有所有的检查,还是有才华的程序员仅仅浏览一下代码就会看到危险?

如果您的code needs root,使用sudo,如果有很多只需运行它作为root..我的回答在这里结束

票数 -4
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/479055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档