加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

发布时间:2020-12-14 03:02:08 所属栏目:Linux 来源:网络整理
导读:使用CentOs,我想将脚本作为用户“培训”作为系统服务运行.我使用daemontools来监视进程,这需要一个以root身份运行并且没有tty标准的启动器脚本. 下面我给出了我尝试失败的五种尝试. : #!/bin/bashexec /var/log/training_service.log 21setuidgid training
使用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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读