node: 支持指定用户执行命令

pull/1/head
miraclesu 2017-02-16 12:00:31 +08:00
parent 3b7139f52d
commit 5661cce065
3 changed files with 31 additions and 3 deletions

View File

@ -24,6 +24,7 @@ func main() {
//set cpu usage
runtime.GOMAXPROCS(*gomax)
models.InitPwd()
if err := models.Init(); err != nil {
log.Error(err.Error())
return

View File

@ -1,15 +1,29 @@
package models
import (
"sunteng/commons/db/imgo"
"errors"
"os/exec"
"sunteng/commons/db/imgo"
"sunteng/commons/log"
"sunteng/cronsun/conf"
)
var (
initialized bool
needPassword = false
SudoErr = errors.New("sudo need password")
)
func InitPwd() {
// 不支持 windows
if _, err := exec.Command("sh", "-c", "echo |sudo -S echo &>/dev/null").Output(); err != nil {
log.Warnf("当前用户 sudo 需要密码,所有指定用户执行的命令都将失败")
needPassword = true
}
}
func Init() (err error) {
if initialized {
return

View File

@ -25,6 +25,7 @@ type Job struct {
Name string `json:"name"`
Group string `json:"group"`
Command string `json:"cmd"`
User string `json:"user"`
Rules []*JobRule `json:"rules"`
Pause bool `json:"pause"` // 可手工控制的状态
@ -170,8 +171,20 @@ func (j *Job) String() string {
// Run 执行任务
func (j *Job) Run() {
cmd, t := strings.Split(j.Command, " "), time.Now()
out, err := exec.Command(cmd[0], cmd[1:]...).Output()
t := time.Now()
var cmd *exec.Cmd
if len(j.User) > 0 {
if needPassword {
j.Fail(t, SudoErr)
return
}
cmd = exec.Command("sudo", "su", j.User, "-c", j.Command)
} else {
args := strings.Split(j.Command, " ")
cmd = exec.Command(args[0], args[1:]...)
}
out, err := cmd.Output()
if err != nil {
j.Fail(t, err)
return