Shell脚本如何在不以sudo身份运行的情况下获取超级用户权限

4

以下是我的脚本:

script.sh

sudo cat /etc/passwd-

如果我正在 sudo 会话中(例如,几分钟前我使用 sudo 运行了另一个命令),现在运行
script.sh

脚本将获得sudo访问权限。但是,如果我运行cat /etc/passwd-/,我将收到权限被拒绝的错误。
作为用户,我不希望script.sh能够如此简单地获得超级用户权限(例如,没有使用sudo script.sh给予超级用户权限)。
这是预期的行为吗? 它是否可配置?
我认为这种行为与sudo su完全相似,例如,在该会话中可能会向任何运行的脚本授予超级用户访问权限,但更糟糕的是,您可能甚至没有意识到它,并且不知道何时结束(至少不用手动检查)。

您的会话已缓存凭据。当您以自己的身份运行脚本时,它们仍然被缓存。在单独的会话中运行脚本以避免这种情况,并且您还可以调整缓存长度(也限制使用sudo进行的操作)。 - Etan Reisner
如果所有脚本都可以要求凭据,那么在安全方面使用sudo与超级用户会话有何区别?当凭据被缓存时,您是否会创建一个特殊用户来运行非sudo脚本? - edi9999
1
“sudo”比仅允许用户成为超级用户更加可配置;可以限制用户仅使用特定的特权命令,无论是否需要密码。 - chepner
把你使用sudo运行的会话视为su会话,这样你就会更安全(不要从那里做其他事情,限制访问范围等)。你可能能够强制过期缓存等。查看sudo配置。你可以用它做很多事情。 - Etan Reisner
你可以通过这个链接更改凭据缓存的时间。 - Aereaux
1个回答

4

这是预期行为吗?

确实如此,这是预期的行为。用户缓存的sudo凭据对其负责。

它可以配置吗?

是的,它可以配置。

我认为您的安全问题是有效的。在运行script.sh之前(在某个超时时间内)在终端中运行sudo命令将赋予该脚本超级用户特权(如果脚本是使用显式sudo命令编写的)。

您可以通过以下方式避免任何未提示输入密码就以sudo身份运行的脚本:

sudo -k script.sh

无论之前是否执行过sudo命令或会话,它都会要求输入密码。

如果想要只使用 script.sh 命令运行 script.sh 并提示输入 sudo 命令的密码:

您可以永久更改超时值(sudo维护会话的持续时间):

运行 sudo visudo

然后更改以下行:

Defaults        env_reset

To

Defaults        env_reset,timestamp_timeout=0

保存并退出(ctrl+X然后Y)

这将确保每次运行sudo时都会要求输入密码。

或者如果您不想永久更改它,并且希望您的脚本至少在一次提示密码后再保持会话,则可以像这样更改您的脚本:

sudo -k first-command-with-sudo
sudo second-command
sudo third
and so on

此脚本将至少要求输入一次密码,无论之前是否使用过sudo命令或会话。
如果您不知道(或无权访问)script.sh脚本的内容(它可能包含sudo命令,也可能没有),并且您想确保任何sudo命令都至少会提示一次密码,请在运行脚本之前运行sudo -K(大写K)。
现在,如果您运行script.sh并且其中包含sudo命令,则它肯定会提示输入密码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接