使用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