以另一个用户身份执行脚本而不是root

3

情况:

我希望能够直接从Web界面执行一个Shell脚本。该脚本属于用户“tux”。 由于我的Web服务器正在以Apache身份运行,因此我无法执行tux的Shell脚本。 操作系统:CENTOS

我尝试过的方法:

su -c "/opt/tomcat/bin/shutdown.sh" -s /bin/sh tux

我尝试了不同的方法,提到的方法是当我以root用户身份登录时有效的。

问题:

有没有一种方法可以在不作为root用户的情况下执行相同的操作?比如一个命令,我可以传递用户名和密码来执行脚本。

我不能只改变脚本的所有权,因为它依赖于tux的配置文件(其他文件、目录)。

非常感谢您的帮助!

2个回答

1
你可以使用NOPASSWD将用户tux添加到/etc/sudoers中,以允许它在不需要输入密码的情况下运行sudo
例如,在/etc/sudoers的末尾添加以下内容,以允许执行任何命令时不需要输入密码(请注意,有一个专门的工具visudo来完成此操作):
tux    ALL=(ALL) NOPASSWD:  ALL

或者,一种更加受限制的方式 - 只允许您的脚本执行此操作:
tux    ALL = NOPASSWD: /opt/tomcat/bin/shutdown.sh

之后,请通过在终端中运行任何命令来检查更改是否生效,例如:

sudo id

并且它不应提示输入root密码。
更新:
为了使Apache运行属于另一个用户(例如tux)的脚本,请将此行添加到sudoers中:
www-data ALL=(ALL) NOPASSWD: /bin/bash /opt/tomcat/bin/shutdown.sh

然后您应该能够像这样无需密码运行它:

sudo -u tux /opt/tomcat/bin/shutdown.sh

同时,也请查看以下内容:


这个想法很好,我没有想到,谢谢。但是它仍然存在一些问题: 如果我允许执行所有内容,这将导致安全问题。如果我只允许执行脚本,那么就会遇到依赖性的问题。 - Yanik
我对依赖关系不太确定,最好是只允许运行shutdown.sh的实验一下,看看是否有任何依赖项会继承它的权限。不幸的是,我暂时没有一个具有根访问权限的 shell 可供测试。 - dekkard
问题在于关闭Web服务器的关机脚本需要访问日志文件。这些文件是之前由拥有脚本所有权的用户创建的。 我尝试允许对这些文件的访问,但很遗憾没有成功。 最好的方法是通过传递密码作为tux来真正执行脚本! - Yanik
当您使用sudo运行命令而没有指定用户时,您将以root身份运行它。因此,您应该可以访问所有内容。 NOPASSWD 只是简单地禁用了通常在这种情况下会出现的密码提示。 - dekkard
我觉得你误解了我的意思。我想要能够以非root用户的身份执行脚本!否则事情会变得清晰明了 :) - Yanik
非常感谢您,先生。这是一个在我的情况下有效的解决方法(更新)。我仍在努力寻找一种好的非变通方式来完成工作。这意味着要进行登录并通过登录传递密码。不幸的是,看起来这不会在ssh或su中起作用。Sudo和sshpass都不是选项。 如果我找不到其他方法,当然,我会接受您的答案,因为这是迄今为止最接近我所要求的。 - Yanik

1

试试这个:

echo "$pass" | sudo -S -u $user script

$pass 是您的密码,$user 是想要运行脚本的用户。(该用户必须有运行脚本的权限。)

如果您的 user 没有权限,则尝试以组身份运行:

echo "$pass" | sudo -S -g $group script

这个组必须有运行脚本的权限。

注意:像这样传递密码并不是一个好主意。

如果您的用户不能使用sudo:

如果您的用户不能使用sudo,则无法通过使用sudo切换用户来运行脚本。您应该考虑使用此非sudo用户帐户执行脚本。为此,此用户必须具有执行脚本的权限。

其中一种方法是更改脚本的权限为755(从sudo用户):

然后,您可以通过在终端中输入路径来执行脚本。(如果您的脚本依赖于相对路径,请确保在运行之前cd到脚本的父目录)

注意:这将允许任何用户执行脚本(无需进行任何身份验证)

另一种方法是将非sudo用户添加到具有执行脚本权限的组中:

在这种情况下,权限如下:

chmod ug+rwx,o-x+r script
#read write xecute permission to user and group and readonly to others

并且

chmod u+rwx,g+rx,o-x+r
#read write xecute to user and rx to group and readonly to others 

等等,在组拥有执行文件的权限时,可以使用该技巧。这比使用 755 权限更安全。

执行此过程的步骤:

1.登录具有sudo特权的用户帐户。

2.更改脚本的权限,只允许用户和组执行该脚本。

例如:

chmod u+rwx,g+rx,o-x path/to/the/script

3. 将非sudo用户添加到当前用户组:

sudo usermod -g $USER non_sudo_user_name
#you don't need to edit $USER, only non_sudo_user_name

4. 在非sudo用户账户中进行新的登录。

现在,您可以通过运行以下命令来执行脚本:

/path/to/the/script

注意:如果您的脚本依赖于相对路径,则在运行之前可能需要cd到脚本的父目录。

非常感谢您的回答。不幸的是,它没有起作用。 - Yanik
你是将tux作为用户传递还是其他?如果是其他,它将无法工作。 - Jahid
再次感谢,但它仍然不能按照我想要的方式工作。只有当我以具有根权限的用户身份登录时才能正常工作。我希望能够在不使用sudo的情况下执行其他用户的脚本,通过输入密码即可。如果这是可能的话。 - Yanik
如果您的用户无法使用sudo,则我认为您无法提供密码并执行该脚本。我知道的唯一方法是明确授予执行脚本的权限。您可以将sudo用户简单地添加到非sudo用户作为组。这样,您就可以在不使用sudo和密码的情况下执行脚本。 - Jahid
@th1nk,已经编辑并详细说明了如何在不需要密码的情况下执行该程序,同时保证了足够的安全保障。希望对你有所帮助... - Jahid
显示剩余2条评论

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