情况如下。
- 我有一个 FreeBSD 用户
M
,它是 的别名root
,即它的 UID 等于 0。 - 我有一个守护进程启动了
M
(如果重要的话,作为自动登录控制台的shell)。 - 守护进程应该以
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()
成功,它必须以超级用户权限运行。