以其他用户身份调用脚本的脚本

以其他用户身份调用脚本的脚本

使用 CentOs,我想以用户“training”的身份运行一个脚本作为系统服务。我使用 daemontools 来监视该进程,它需要一个以 root 身份运行的启动器脚本:

  1. #!/bin/bash
    exec >> /var/log/training_service.log 2>&1
    setuidgid training training_command
    

    最后一行还不够好,因为对于 training_command,我们需要设置训练用户的环境。

  2. su - training -c 'training_command' 
    

    将“ standard in must be tty”作为 su 给出,确保 tty 存在,以便可能接受密码。我知道我可以通过修改 /etc/sudoers 来让它消失 Bash 和‘su’脚本给出错误“标准输入必须是 tty”但我不太情愿,也不确定后果会怎样。

  3. runuser - training -c 'training_command' 
    

    给出runuser: cannot set groups: Connection refused。我发现这条消息没有任何意义或解决办法。

  4. ssh -p100 training@localhost'源$HOME/.bashrc;training_command'

我得到Host key verification failed.(主机密钥在known_hosts中,等等)。

注意:如果我从根 shell 运行包装器脚本,那么 2、3、4 均能正常工作。仅当系统服务监视器(daemontools)启动它时才会出现问题(我猜没有 tty 终端)。

我陷入了困境。这件事真的很难实现吗?

我感谢所有关于最佳实践的见解和指导。

答案1

如果 mugen kenichi 的解决方案不可行,请在启动脚本中获取环境。我有一些使用 mugen 方法的启动脚本,还有一些直接在脚本中获取环境。这通常只是一个偏好问题。直接在启动脚本中获取环境对于可能编辑脚本的其他用户(或 6 个月后的您)来说更加透明。

由于我的环境由许多条件组成,因此更容易隐式。以下是我的启动脚本之一的前几行:

#!/bin/bash
. /my/tools/environment/apps/apps_rc
. /my/tools/environment/functions/common.bash 

完成后使用以相关用户的身份正常启动该进程。

下面是我如何使用 启动类似过程的示例su

su -l $USER -c "nohup $APP_PATH" >> $LOG_FILE 2>&1 < /dev/null &

您也可以选择查看守护进程包。我也经常使用它。

最后...

从你的问题来看,你可能想以特权用户身份运行该脚本,但实际上你可能需要在脚本上设置 setuid 位允许它以 root 身份正常使用。这可能存在安全隐患,因此在执行此操作时要清楚自己在做什么。

答案2

您需要禁用forrequiretty中的设置。通过添加以下行:/etc/sudoersrootvisudo

Defaults:root !requiretty

您还需要以下行/etc/sudoers才能root完成所有操作(这应该默认启用,但请检查以确保):

root ALL=(ALL) ALL

然后您可以执行以下操作:

sudo -u training /path/to/training_command

相关内容