Назад | Перейти на главную страницу

Идентификация пользователя с псевдонимом FreeBSD и экран GNU

Ситуация следующая.

  1. У меня есть пользователь FreeBSD M, который является псевдонимом для root, т.е. его UID равен 0.
  2. У меня демон запустился как M (как оболочка для консоли автоматического входа, если это важно).
  3. Демон должен запуститься screen не интерактивно. И это действительно так, но вот причуда: screen также начинается как M, поэтому его файл сокета помещается в /tmp/screens/Mне /tmp/screens/root где мне действительно нужно, чтобы он мог подключиться как root, все еще оставляя screen в однопользовательском режиме).

Я безуспешно пробовал следующее:

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

и

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

Как он определяет настоящее имя пользователя? Как я могу заставить его думать, что это действительно root и нет M?

Просматривая источники screen, Я обнаружил, что он использует функцию POSIX getlogin() чтобы получить логин сеанса. Обычно он не сохраняется в переменной. НО существует дополнительная функция setlogin(), что помогает (по крайней мере, для меня на 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;
}

Конечно, для setlogin() чтобы добиться успеха, он должен быть запущен с привилегиями суперпользователя.