在将 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
有效地让user1
、user2
、user3
和reporter
执行任何操作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。通常,对于root
shell,使用sudo -s
。当然,要...
使用运行命令sudo
,只需使用sudo ...
。)
su -c
和sudo
采用不同的语法,因此如果您确实想让该命令使用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
但无法正常工作,则原因不是sudo
vs.的问题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。