使用 CentOs,我想以用户“training”的身份运行一个脚本作为系统服务。我使用 daemontools 来监视该进程,它需要一个以 root 身份运行的启动器脚本:
:
#!/bin/bash exec >> /var/log/training_service.log 2>&1 setuidgid training training_command
最后一行还不够好,因为对于 training_command,我们需要设置训练用户的环境。
:
su - training -c 'training_command'
将“
standard in must be tty
”作为 su 给出,确保 tty 存在,以便可能接受密码。我知道我可以通过修改 /etc/sudoers 来让它消失 Bash 和‘su’脚本给出错误“标准输入必须是 tty”但我不太情愿,也不确定后果会怎样。:
runuser - training -c 'training_command'
给出
runuser: cannot set groups: Connection refused
。我发现这条消息没有任何意义或解决办法。:
ssh -p100 training@localhost'源$HOME/.bashrc;training_command'
我得到Host key verification failed.
(主机密钥在known_hosts中,等等)。
注意:如果我从根 shell 运行包装器脚本,那么 2、3、4 均能正常工作。仅当系统服务监视器(daemontools)启动它时才会出现问题(我猜没有 tty 终端)。
我陷入了困境。这件事真的很难实现吗?
我感谢所有关于最佳实践的见解和指导。
答案1
如果 mugen kenichi 的解决方案不可行,请在启动脚本中获取环境。我有一些使用 mugen 方法的启动脚本,还有一些直接在脚本中获取环境。这通常只是一个偏好问题。直接在启动脚本中获取环境对于可能编辑脚本的其他用户(或 6 个月后的您)来说更加透明。
由于我的环境由许多条件组成,因此更容易隐式。以下是我的启动脚本之一的前几行:
#!/bin/bash
. /my/tools/environment/apps/apps_rc
. /my/tools/environment/functions/common.bash
完成后使用苏以相关用户的身份正常启动该进程。
下面是我如何使用 启动类似过程的示例su
。
su -l $USER -c "nohup $APP_PATH" >> $LOG_FILE 2>&1 < /dev/null &
您也可以选择查看守护进程包。我也经常使用它。
最后...
从你的问题来看,你可能想以特权用户身份运行该脚本,但实际上你可能需要在脚本上设置 setuid 位允许它以 root 身份正常使用。这可能存在安全隐患,因此在执行此操作时要清楚自己在做什么。
答案2
您需要禁用forrequiretty
中的设置。通过添加以下行:/etc/sudoers
root
visudo
Defaults:root !requiretty
您还需要以下行/etc/sudoers
才能root
完成所有操作(这应该默认启用,但请检查以确保):
root ALL=(ALL) ALL
然后您可以执行以下操作:
sudo -u training /path/to/training_command