Bash 脚本中无需密码即可进行 su?

Bash 脚本中无需密码即可进行 su?

在将 Hadoop 安装从 Oracle Enterprise Linux 迁移到 Ubuntu 时,我遇到了一个难题。之前的开发人员rc.local在 OEL 中输入了以下命令:

su reporter -c "cd /path/to/directorywithscript && bash runwebserver.sh >> /dev/null 2>&1&"

我需要上述 Web 服务器以指定reporter用户身份在 Ubuntu 中自动启动(和停止)。(自动化功能是很多不如让这个脚本以用户身份正确运行重要reporter,但是是一个“不错的”功能。)

此过程需要最后启动,因为我仍需要配置其他几个与 Hadoop 相关的脚本,使其在此过程之前自动启动(Web 服务器驻留在 Hadoop 文件系统中,在您进入操作系统后才会挂载)。每次我发出命令时,系统su都会要求我输入密码。无论哪个用户当前处于“活动”状态,都会发生这种情况,并且在 OEL 中不是问题,因为实际使用的是 Root 用户。这是我当前对 /etc/sudoers 文件的尝试,但它仍然不起作用(我不确定我在底部所做的更改是否正确):

# /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for details on how to write a sudoers file.
#

Defaults        env_reset

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification

# Allow members of group sudo to execute any command after they have
# provided their password
# (Note that later entries override this, so you might need to move
# it further down)
%sudo ALL=(ALL) ALL
#
#includedir /etc/sudoers.d

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# User privilege specification
root    ALL=(ALL) ALL
user3 ALL=(ALL)NOPASSWD:/bin/su
user2 ALL=(ALL)NOPASSWD:/bin/su
user1 ALL=(ALL)NOPASSWD:/bin/su
reporter ALL=(ALL)NOPASSWD:/bin/su

这是我在 UbuntuForums.org 上发布的一个帖子的副本(http://ubuntuforums.org/showthread.php?p=12040341#post12040341),但我迫切需要一个答案 =P。请注意,我的 Linux 知识仍然很薄弱(在这个项目落到我手里之前,我几乎不懂 Linux)。任何帮助都是大大非常感谢,因为这是目前的一个重大绊脚石!

谢谢,-Snipe

答案1

您当前的编辑/etc/sudoers有效地让user1user2user3reporter执行任何操作root(因为运行su可以让您成为root)!您几乎肯定不想要这样。而且这对您当前的问题没有任何帮助,因为您不希望这些用户以其他身份运行某些东西,您想以root其他身份运行某些东西。在继续之前,我建议删除这些行/etc/sudoers(当然用 编辑它visudo),除非您绝对确定这就是您想要的。

如果您是非root用户并运行此程序,系统将始终要求您输入密码:

su reporter -c "cd /path/to/directorywithscript && bash runwebserver.sh >> /dev/null 2>&1&"

但是当root运行它时,它应该会成功(假设它之前在 Oracle Enterprise Server 上运行过,唯一相关的区别是root登录在 Ubuntu 上被禁用)。

当您将该行放入 中时rc.local,在任何 GNU/Linux 发行版(包括 Ubuntu)中,它都会作为 运行root。它应该可以正常工作。当您从命令行运行它时,它将无法正常工作。但在 中rc.local,它应该可以正常工作。

如果您想从命令行测试它,请给自己一个与环境root非常相似的 shell :rc.local

sudo -i

(这模拟了初始root登录 shell。通常,对于rootshell,使用sudo -s。当然,要...使用运行命令sudo,只需使用sudo ...。)

su -csudo采用不同的语法,因此如果您确实想让该命令使用sudo而不是su,则必须进行其他更改。最简单的方法可能是:

sudo -u reporter bash -c "cd /path/to/directorywithscript && ./runwebserver.sh >> /dev/null 2>&1&"

然而,我要强调的是您不需要将su命令转换为,sudo以便它们能够正确运行rc.local

在 Ubuntu 中,与 Oracle Enterprise Server 不同,root默认情况下禁用登录身份(并且您几乎肯定不应该启用它)。但su在运行时仍然有效经过 root.su也适用于非root用户将身份更改为另一个非root用户。

如果您输入了此行rc.local但无法正常工作,则原因不是sudovs.的问题su。在这种情况下,其他问题出现了。为了让我们解决问题,您必须提供 的内容runwebserver.sh

最后,请注意 相当bash runwebserver.sh >> /dev/null 2>&1&不雅。使用 更容易理解(而且,更重要的是,看起来更漂亮)bash runwebserver.sh &>> /dev/null。你说这在 中最后运行rc.local,所以你不必使用&它来让它处于后台。

然而,你应该考虑一下,如果你真的想抑制标准误差标准输出(正如您目前正在做的)。如果某些内容被写入标准错误,那么它要么很重要,要么可以通过更改 Web 服务器的详细程度设置来抑制。

答案2

如果您不想被要求输入密码,您将必须使用以 root 身份执行 su,因此您必须使用:

sudo su reporter -c "cd /path/to/directorywithscript && bash runwebserver.sh >> /dev/null 2>&1&"

然而,我认为您正在尝试做的是一个非常糟糕的主意,您允许每个用户以任何其他人的身份登录,包括 root。

相关内容