FreeBSD别名用户标识和GNU屏幕

情况如下。

  1. 我有FreeBSD用户M ,它是root的别名,即它的UID等于0。
  2. 我有一个以M开头的守护进程(作为自动login控制台的shell,如果它很重要)。
  3. 守护进程应该以非交互方式启动screen 。 它实际上是这样,但这里的怪癖: screen也开始作为M ,因此它的套接字文件被放置到/tmp/screens/M ,而不是/tmp/screens/root我实际上需要它能够作为根连接仍然以单用户模式离开screen )。

我已经尝试了以下没有成功:

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

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

它如何检测实际的用户名? 我怎么能强迫它认为它是真正的root而不是M

在查看screen的来源时,我发现它使用POSIX函数getlogin()来获得会话login。 它通常不被存储在一个variables中。 但是存在一个互补的函数setlogin() ,这个函数至less在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()成功,它必须以超级用户权限运行。