2010-10-13 10 views
2

Je dois exécuter cette commande avec un nom d'utilisateur donné; en bash ce serait,Comment changer d'utilisateur dans Go à partir du nom d'utilisateur?

$su devrim -c "touch miki" 

je suppose, d'abord je dois obtenir le uid du nom d'utilisateur et d'utiliser setuid avant de faire ForkExec.

pouvez-vous des conseils? Comment puis-je faire cela ? (Ps: je n'ai pas le uid, seul le nom d'utilisateur)

func exec(cmd *Command, async bool) os.Error { 
    parts := strings.Fields(cmd.Command) 
    command := parts[0] 

    // cmd.Su holds the username "root" or "myUser" 

    pid, err := os.ForkExec(command, parts, os.Environ(), "", []*os.File{nil, cmd.Stdout, cmd.Stderr}) 
    cmd.Pid = pid 

    if !async { 
     os.Wait(pid, 0) 
    } 
    return nil 
} 

modifier: puisque cette chose SYSUSER n'a pas fonctionné, et j'ai vu qu'il est l'analyse que le fichier/etc/passwd i décidé de le faire moi-même :

func getUid(su string) int{ 

    passwd,_ := os.Open("/etc/passwd", os.O_RDONLY , 0600) 

    reader := bufio.NewReader(passwd) 

    for { 
     line,err := reader.ReadString('\n') 
     if err != nil { 
      println(err.String()) 
      break 
     } 

     parsed := strings.Split(line,":",4) 

     if parsed[0] == su { 
      value,_ := strconv.Atoi(parsed[2]) 
      return value 
     } 
    } 

    return -1 
} 

Je ne sais pas si tous/etc/passwd sont formés de la même accross * de nix, nous utilisons et ubuntu debian, Manoeuvrer avec précaution.

Répondre

3

Ce package http://github.com/kless/go-sysuser peut accéder aux noms d'utilisateur, etc.

Le syscall package a des appels à Set/Get UID, etc.

+0

thx cthom! bien qu'il lance une erreur et ne s'installe pas, c'est ce que je recherche. – Devrim

+0

@Devrim ahh, eh bien je ne l'ai pas réellement utilisé. Mais il peut s'agir simplement d'un problème de fichier makefile ou d'un simple changement mineur pour être synchronisé avec la dernière version de Go. – cthom06

+1

sysuser était uniquement analysé, pas de méthode go native pour le faire. donc je l'ai analysé moi-même - la solution est au-dessus. Merci encore! – Devrim