Ситуация следующая.
M
, который является псевдонимом для root
, т.е. его UID равен 0.M
(как оболочка для консоли автоматического входа, если это важно).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()
чтобы добиться успеха, он должен быть запущен с привилегиями суперпользователя.