从没有 tty stdin 的根脚本中以另一个用户身份运行脚本

Vik*_*rón 4 linux su shell centos daemontools

使用 CentOs,我想以用户“培训”的身份运行脚本作为系统服务。我使用 daemontools 来监控进程,它需要一个以 root 身份运行并且没有 tty 标准的启动程序脚本。

下面我给出了我的五种不同尝试,但都失败了。

  1. #!/bin/bash
    exec >> /var/log/training_service.log 2>&1
    setuidgid training training_command
    
    Run Code Online (Sandbox Code Playgroud)

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

  2. su - training -c 'training_command' 
    
    Run Code Online (Sandbox Code Playgroud)

    这看起来像(以不同的用户身份运行 shell 脚本)但提供 ' standard in must be tty' as su 确保 tty 存在以可能接受密码。我知道我可以通过修改 /etc/sudoers(a la https://superuser.com/questions/119376/bash-su-script-giving-an-error-standard-in-must-be-a- tty)但我不情愿并且不确定后果。

  3. sudo -u training -i bash -c 'source $HOME/.bashrc; training_command'
    
    Run Code Online (Sandbox Code Playgroud)

    同一主题的变体:' sudo: sorry, you must have a tty to run sudo'

  4. runuser - training -c 'training_command'  
    
    Run Code Online (Sandbox Code Playgroud)

    这个给runuser: cannot set groups: Connection refused。我发现这个错误没有任何意义或解决办法。

  5. ssh -p100 training@localhost 'source $HOME/.bashrc; training_command'
    
    Run Code Online (Sandbox Code Playgroud)

    这更像是一个表达绝望的笑话。即使这个失败Host key verification failed.(主机密钥是 known_hosts 等)。

注意:如果我从根 shell 运行包装器脚本,所有 2,3,4 都可以正常工作。只有在系统服务监视器(daemontools)启动它时才会出现问题(我猜没有 tty 终端)。

我被困住了。这是很难实现的事情吗?

我感谢所有对最佳实践的洞察力和指导。

(这也已发布在超级用户上:https : //superuser.com/questions/434235/script-calling-script-as-other-user

Uri*_*Dev 6

您将需要禁用for 中的requiretty设置。通过以下方式添加以下行:/etc/sudoersrootvisudo

Defaults:root !requiretty
Run Code Online (Sandbox Code Playgroud)

您还需要以下行,/etc/sudoers以便root可以执行所有操作(默认情况下应启用此功能,但请检查以确保):

root ALL=(ALL) ALL
Run Code Online (Sandbox Code Playgroud)

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

sudo -u training /path/to/training_command
Run Code Online (Sandbox Code Playgroud)