【问题标题】:Switch user in a init script?在初始化脚本中切换用户?
【发布时间】:2012-02-14 23:32:20
【问题描述】:

这是我在 Ubuntu 工作站上的初始化脚本。我需要以 root 用户以外的其他用户身份运行命令,但我无法理解应该如何完成。 sudo -usu newuser 似乎都不起作用。

脚本:

respawn
console none

start on runlevel [2345]
stop on runlevel [06]

script
  su "anotherUser" -c ./myCommand
end script

【问题讨论】:

  • 使用这种类型的命令 "su -c 'your command' different_user"
  • 正如@Henrick 在下面的回答中指出的那样,新贵脚本可以使用setuid configuration stanza 来设置用户。

标签: ubuntu sudo init


【解决方案1】:

我用这个:

su -l $MUSER -c "myCommand args..."

更新:由于对这个答案很感兴趣,我在这里解释一下我的使用方式。

我们以普通 linux 用户而不是 root 用户身份运行服务器。用户名包含三部分:

服务、客户、阶段

这样我们可以在一个 Linux 操作系统中为多个客户运行多个服务。

示例:foo_bar_p 客户“bar”的服务“foo”,“p”表示生产

这是初始化脚本的一部分。 init 脚本可以以 root 或 foo_bar_p 用户身份执行:

# /etc/init.d/foo_bar_p-celeryd
# scriptname contains linux username  
SCRIPT_NAME=`basename "$0"`
SYSTEM=${SCRIPT_NAME%*-celeryd}

U=`id -nu`

if [ ! $U == $SYSTEM ]; then
    if [ $U == "root" ]; then
        # use "-l (login)" to delete the environment variables of the calling shell.
        exec su -l $SYSTEM -c "$0 $@"
    fi
    echo "Script must be run from $SYSTEM or root. You are '$U'"
    rc_exit 1
fi

# OK, now I am foo_bar_p
cd
. $HOME/.bashrc
....

【讨论】:

  • -l 开关有什么作用??
  • -l | --login 一种使 shell 启动登录 shell 的方法。
  • 我不知道脚本的实际开始发生在哪里?作者说:su -l $MUSER -c "myCommand args...",然后他显示了脚本foo_bar_p-celeryd,它检查它是由root还是用户启动的。但实际上如何确定(定义)谁启动脚本foo_bar_p-celeryd
  • @beemaster 脚本 /etc/init.d/foo_bar_p-celeryd 由 system-v init 调用。这是旧的 Unix 东西。今天我使用 systemd,我对 systemd 非常满意。这个回答你评论吗?
【解决方案2】:

对于新贵,使用:

setuid myuser
exec command args

【讨论】:

  • 不错!它会加载 .bashrc、配置文件和类似的东西吗?
【解决方案3】:

su 可能是一种更通用的方法,但在一些带有 sudo 的常见发行版上也是可能的:

sudo -u $MUSER $COMMAND $ARGS

(只是重新阅读您的问题,并没有意识到这对您不起作用,但它在初始化脚本中对我有用)

【讨论】:

  • 已在 /etc/rc.local 中尝试过此操作,但不适用于 Ubuntu 16.04。也试过这个:su -l user -c /home/user/script。有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多