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

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

概述使用CentOs,我想将脚本作为用户“培训”作为系统服务运行.我使用daemontools来监视进程,这需要一个以root身份运行并且没有tty标准的启动器脚本. 下面我给出了我尝试失败的五种尝试. >: #!/bin/bashexec >> /var/log/training_service.log 2>&1setuidgid training training_command 最后一行不够 使用CentOs,我想将脚本作为用户“培训”作为系统服务运行.我使用daemontools来监视进程,这需要一个以root身份运行并且没有tty标准的启动器脚本.

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

>:

#!/bin/bashexec >> /var/log/training_service.log 2>&1setuIDgID 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
总结

以上是内存溢出为你收集整理的linux – 从没有tty stdin的根脚本中以另一个用户身份运行脚本全部内容,希望文章能够帮你解决linux – 从没有tty stdin的根脚本中以另一个用户身份运行脚本所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1037148.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存