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

前端之家收集整理的这篇文章主要介绍了linux – 从没有tty stdin的根脚本中以另一个用户身份运行脚本前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
使用CentOs,我想将脚本作为用户“培训”作为系统服务运行.我使用daemontools来监视进程,这需要一个以root身份运行并且没有tty标准的启动器脚本.

下面我给出了我尝试失败的五种尝试.

>:

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

最后一行不够好,因为对于training_command,我们需要环境来设置用户.
>:

su - training -c 'training_command'

这看起来像它(Run a shell script as a different user),但给’标准必须是tty’作为su确保tty存在可能接受密码.我知道我可以通过修改/ etc / sudoers(la https://superuser.com/questions/119376/bash-su-script-giving-an-error-standard-in-must-be-a-tty)使其消失,但我不愿意并且不确定后果.
>:

sudo -u training -i bash -c 'source $HOME/.bashrc; training_command'

同一主题的变体:’sudo:对不起,你必须有一个tty来运行sudo’
>:

runuser - training -c 'training_command'

这个给runuser:无法设置组:连接被拒绝.我发现这个错误没有任何意义或解决方法.
>:

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

这个更像是一个表达解脱的笑话.即使这一个失败,主机密钥验证失败. (主机密钥IS在known_hosts等中).

注意:如果我从root shell运行包装器脚本,那么所有2,3,4都应该工作.只有在系统服务监视器(daemontools)启动时才会出现问题(我猜没有tty终端).

我被卡住了.这件事难以实现吗?

我感谢所有对最佳实践的见解和指导.

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

解决方法

您需要在/ etc / sudoers中为root禁用requiretty设置.通过visudo添加以下行:
Defaults:root !requiretty

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

root ALL=(ALL) ALL

然后你可以做以下事情:

sudo -u training /path/to/training_command
原文链接:https://www.f2er.com/linux/397389.html

猜你在找的Linux相关文章