FreeBSD 别名用户识别和 GNU 屏幕

FreeBSD 别名用户识别和 GNU 屏幕

情况如下。

  1. 我有一个 FreeBSD 用户M,它是 的别名root,即它的 UID 等于 0。
  2. 我有一个守护进程启动了M(如果重要的话,作为自动登录控制台的shell)。
  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

答案1

在查看 的源代码时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()成功,它必须以超级用户权限运行。

相关内容