Identificação de usuário com alias do FreeBSD e tela GNU

1

A situação é a seguinte.

  1. Eu tenho o usuário do FreeBSD M , que é um alias para root , ou seja, seu UID é igual a 0.
  2. Eu tenho um daemon iniciado como M (como um shell para um console de login automático, se isso for importante).
  3. O daemon deve iniciar screen de forma não interativa. E isso realmente acontece, mas aqui está a peculiaridade: screen também começa como M , portanto, seu arquivo de soquete é colocado em /tmp/screens/M , não /tmp/screens/root onde eu realmente preciso que ele possa ser anexado como raiz enquanto ainda estiver saindo screen no modo de usuário único.

Eu tentei o seguinte sem sucesso:

USER=root /usr/local/bin/screen ...

e

sudo /usr/local/bin/screen ...

Como ele detecta o nome de usuário real? Como posso forçá-lo a pensar que é realmente root e não M ?

    
por vines 13.12.2011 / 15:57

1 resposta

2

Enquanto procurava pelas fontes de screen , descobri que ele utiliza a função POSIX getlogin() para obter o login da sessão. Não é, geralmente, armazenado em uma variável. MAS existe a função complementar setlogin() , que faz o truque (pelo menos para mim no FreeBSD8.2):

#include <stdio.h>
#include <unistd.h>

int main(int argc, char ** argv)
{
    if (argc == 1)
    {
        char * l = getlogin();
        printf("Current login: %s\n", l ? l : "(NULL)");
    }
    else
    {
        int s = setlogin(argv[1]);
        printf("setlogin(\"%s\") returned %d\n", argv[1], s);
        if (s) perror("setlogin");
    }
    return 0;
}

Certamente, para setlogin() ter sucesso, ele deve ser executado com privilégios de superusuário.

    
por 13.12.2011 / 22:48