C编程。打印当前用户

7
在C编程中,如何获取当前用户和当前工作目录。我想要打印出类似这样的内容:
  asmith@mycomputer:~/Desktop/testProgram:$
  (user) (computerName) (current directory)

我有以下代码,但是用户名显示为NULL。你有什么想法我做错了什么吗?
void prompt()
{
        printf("%s@shell:~%s$", getenv("LOGNAME"), getcwd(currentDirectory, 1024));                 
}

2
为什么这与编程无关呢.. :P - sud03r
抱歉,这是与编程有关的内容...我在添加标签时犯了一个错误。 - user69514
我在Unix环境下。实际上,我在终端上运行时它可以正常工作。但是直接从Eclipse编译时却显示为空值。getlogin也可以正常工作。谢谢大家。 - user69514
6个回答

21

除了你应该使用环境变量USER而不是LOGNAME之外,你首先不应该使用环境变量来做这件事。你可以使用getuid(2)来获取当前用户ID,并使用geteuid(2)来获取当前有效用户ID,然后使用getpwuid(3)从passwd文件中获取用户ID的用户名:

struct passwd *p = getpwuid(getuid());  // Check for NULL!
printf("User name: %s\n", p->pw_name);

要获取当前计算机的名称,请使用 gethostname(2) 函数:

char hostname[HOST_NAME_MAX+1];
gethostname(hostname, sizeof(hostname));  // Check the return value!
printf("Host name: %s\n", hostname);

5

在类Unix系统中,可以使用unistd.h中的getlogin函数。


2
这不是一个C语言问题,而更像是UNIX问题。在C语言中,没有可移植的方法来获取用户名当前工作目录
然而,通过查看你的示例,我可以告诉你正在尝试打印当前UNIX用户名和当前工作目录。
如果需要UNIX中的当前工作目录,请检查getcwd函数
如果需要当前用户名,您可以在C程序中调用单独的whoami进程,或者检查getuid函数调用

1
你也可以使用


#include<stdlib.h>
main()
{
    system("echo %username%");    /* This is for Windows
                                   * instead use system("echo $USER"); for UNIX
                                   */
}

1
这将是平台特定的,因为C编程语言中没有内在的方法来做到这一点。
看起来您正在使用基于Unix的系统,所以您可能想要获取环境变量USER,它通常是登录名。

-2
请注意,此操作仅适用于Unix系统。
可能LOGNAME未设置为您的环境变量
您可以使用printenv命令查看环境变量。
printf("%s@shell:%s$", getenv("USER"),getenv("PWD"))

也能完成工作。

但是如上所述,您不应该依赖环境变量,而是应该使用标准C函数。如果您真的想使用它们,请确保已经设置好了。


4
如果通常从环境变量获取用户(例如根据该信息写入 /etc/shadow),则存在巨大的安全漏洞。某些人可以轻松地设置 USER=root。 - mrBorna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接