linux编写who命令
-
编写Linux的who命令可以通过以下步骤实现:
1. 创建一个C语言源代码文件,命名为”who.c”
“`shell
$ touch who.c
“`2. 打开”who.c”文件,在文件中编写代码实现who命令的功能。下面是一个基本的实现示例:
“`C
#include
#include
#includeint main()
{
struct utmp *utmp_entry;
setutent(); // 打开/重新打开utmp文件
while ((utmp_entry = getutent()) != NULL) // 读取utmp文件中的每一个记录
{
if (utmp_entry->ut_type == USER_PROCESS) // 过滤出已登录用户
{
printf(“%-8s %-8s %-20s %s”, utmp_entry->ut_user, utmp_entry->ut_line, utmp_entry->ut_host, ctime(&(utmp_entry->ut_tv.tv_sec)));
}
}
endutent(); // 关闭utmp文件
return 0;
}
“`3. 保存并退出文件。编译”who.c”文件并生成可执行文件。
“`shell
$ gcc who.c -o who
“`4. 将生成的可执行文件移动到系统可执行文件目录中。
“`shell
$ sudo mv who /usr/bin/
“`现在,你可以在终端中运行”who”命令来查看已登录到系统的用户信息了。
2年前 -
编写 Linux 的 who 命令是一个相对简单的任务,下面是一个基本的实现示例:
“`bash
#!/bin/bash# 获取当前所有登录用户的信息
who | awk ‘{print “User:”, $1, “Terminal:”, $2, “Login time:”, $3, $4}’# 获取当前登录用户数量
users=$(who | wc -l)
echo “Total users logged in: $users”
“`上面的代码使用了 `who` 命令输出所有登录用户的信息,并使用 `awk` 命令对输出进行格式化。脚本还计算了当前登录用户的数量,并将结果输出。
接下来,我们来解释代码的几个关键点:
1. `#!/bin/bash` 是脚本文件的 shebang 行,用于指定此脚本要使用的解释器。
2. `who` 命令用于获取登录用户的信息。
3. `awk ‘{print “User:”, $1, “Terminal:”, $2, “Login time:”, $3, $4}’` 使用 `awk` 命令对 `who` 命令的输出进行格式化。`awk` 命令将输出的每行拆分为列,通过 `$1`、`$2`、`$3`、`$4` 分别表示第一列、第二列、第三列和第四列的内容。然后使用 `print` 命令打印格式化后的信息。
4. `users=$(who | wc -l)` 使用命令替换将 `who | wc -l` 的输出结果赋值给变量 `users`。`who | wc -l` 用于统计登录用户的数量。
5. `echo “Total users logged in: $users”` 打印当前登录用户的数量。
这只是一个简单的实现示例,你可以根据需求对代码进行修改和扩展。例如,你可以添加更多的信息,如 IP 地址、登录状态等,或是使用其他命令来获取数据。
2年前 -
要编写`who`命令,需要了解`Linux`系统中的用户和登录信息。`who`命令用于显示当前登录到系统的用户信息,包括用户名、终端、登录时间等。
编写`who`命令的大致步骤如下:
1. 解析命令行参数
2. 打开系统登录记录文件(通常为`/var/run/utmp`)
3. 读取登录记录文件中的数据,并解析出相关信息
4. 格式化并显示用户信息
5. 关闭文件,释放资源下面是详细的实现步骤:
## 1. 解析命令行参数
首先,需要编写代码来解析命令行参数,例如处理`-a`或`–all`等选项参数。这些选项用于显示所有用户的登录信息。
## 2. 打开系统登录记录文件
登录记录文件通常存储在`/var/run/utmp`或`/var/log/wtmp`中。使用`open`函数打开该文件,并检查是否成功。
“`c
int fd = open(“/var/run/utmp”, O_RDONLY);
if (fd == -1) {
perror(“open”);
exit(EXIT_FAILURE);
}
“`## 3. 读取登录记录文件
使用`read`函数从文件中读取数据,并将其存储在合适的数据结构中。登录记录文件中的每个记录都包含一个`struct utmp`结构,定义在`
`头文件中。可以循环读取记录,并将其存储在一个数组或链表中。 “`c
struct utmp buffer;
while (read(fd, &buffer, sizeof(buffer)) == sizeof(buffer)) {
// 处理数据
}
“`## 4. 解析用户信息
登录记录文件中的每个记录都包含有关用户和登录终端的信息。可以使用`struct utmp`结构体中的字段来获取这些信息,例如`ut_user`(用户名)、`ut_line`(登录终端)、`ut_tv`(登录时间)等。
“`c
printf(“%s %s %s\n”, buffer.ut_user, buffer.ut_line, ctime(&buffer.ut_tv.tv_sec));
“`## 5. 关闭文件和释放资源
在完成读取和显示数据后,需要关闭登录记录文件并释放资源。
“`c
close(fd);
“`以上是一个简单的`who`命令的实现过程。当然,实际的`who`命令还可以包含更多的功能和选项,例如显示用户登录IP地址、登录时长等信息。编写一个完整的`who`命令需要更多的代码和复杂的处理逻辑,但以上步骤应该能够帮助你入门。
2年前