怎么编写Linux的自带的who命令
-
编写Linux自带的who命令需要了解如何编写Shell脚本。下面我将为你提供一个编写who命令的示例:
“`shell
#!/bin/bash
# 获取当前登录系统的用户信息# 使用who命令获取当前登录用户信息,并将结果保存到临时文件
who > /tmp/who_tmp# 逐行读取临时文件,提取需要的信息并输出
cat /tmp/who_tmp | while read line; do
username=$(echo $line | awk ‘{print $1}’) # 提取用户名
terminal=$(echo $line | awk ‘{print $2}’) # 提取终端
login_time=$(echo $line | awk ‘{print $3, $4}’) # 提取登录时间echo “用户名: $username”
echo “终端: $terminal”
echo “登录时间: $login_time”
echo “————————”
done# 删除临时文件
rm /tmp/who_tmp
“`保存以上代码到一个文件(例如:mywho.sh),然后在终端中执行以下命令给予脚本执行权限:
“`shell
chmod +x mywho.sh
“`接下来,你可以在终端中运行这个脚本,执行who命令并输出结果。
“`shell
./mywho.sh
“`以上代码实现了一个简单的who命令,它获取当前登录系统的用户信息,并依次输出用户名、终端和登录时间。你可以根据自己的需求进行进一步的修改和扩展。
2年前 -
编写Linux自带的who命令涉及到了系统底层的操作,需要使用C语言进行编写。下面是编写Linux的自带who命令的步骤:
1. 创建一个新的C文件:首先,使用任意文本编辑器创建一个新的C文件,比如说`mywho.c`。
2. 引入头文件:在C文件的开头,需要引入一些头文件,它们定义了我们需要使用的各种数据类型和函数。对于who命令,需要引入以下头文件:
“`c
#include
#include
#include
#include
#include
#include
“`3. 实现主函数:在C文件中定义一个主函数`main()`,它是程序的入口点。主函数可以为空,但在这里我们需要调用一些其他的函数来完成who命令的功能。
4. 打开utmp文件:utmp文件记录了当前登录到系统的用户信息。我们需要使用`open()`函数来打开utmp文件,并获取一个文件描述符。
“`c
int utmp_fd = open(UTMP_FILE, O_RDONLY);
if(utmp_fd == -1) {
perror(“open”);
exit(EXIT_FAILURE);
}
“`5. 从utmp文件中读取记录:使用`read()`函数从utmp文件中读取记录,并将其存储在utmp结构体中。
“`c
struct utmp current_record;
int record_size = sizeof(current_record);
while(read(utmp_fd, ¤t_record, record_size) == record_size) {
// 对utmp记录进行处理
}
“`6. 处理utmp记录:对于每个utmp记录,可以从中提取出用户的登录名、登录时间等信息,并输出到屏幕上。
“`c
if(current_record.ut_type == USER_PROCESS) {
printf(“%-8.8s”, current_record.ut_name); // 用户登录名
printf(” %-8.8s”, current_record.ut_line); // 终端设备名
printf(” %20.20s”, ctime((time_t*)¤t_record.ut_tv.tv_sec)); // 登录时间
printf(“\n”);
}
“`7. 关闭utmp文件:当所有的utmp记录都被处理完毕后,使用`close()`函数关闭utmp文件。
“`c
if(close(utmp_fd) == -1) {
perror(“close”);
exit(EXIT_FAILURE);
}
“`8. 编译和运行:使用C编译器将C文件编译成可执行文件。
“`bash
gcc mywho.c -o mywho
“`然后,运行编译后的可执行文件即可。
“`bash
./mywho
“`通过以上步骤,你就可以实现一个简单的Linux自带的who命令。当然,这只是一个简单的示例,实际的who命令可能还有其他更复杂的功能和参数。要实现完整的who命令,你可能还需要处理一些其他的情况,比如说系统重启时的utmp记录信息等。
2年前 -
编写Linux自带的who命令需要对Linux系统的用户信息进行查询并展示,下面是编写who命令的方法和操作流程:
**1. 准备工作**
编写who命令前,需要了解Linux系统中用户信息的获取和展示方式。Linux系统中的用户信息存储在/etc/passwd文件中,可以使用一些系统调用函数(如getpwent函数)来获取用户的登录名、用户ID、组ID、用户的真实姓名等信息。此外,Linux系统也提供了一些工具函数(如strftime函数)来格式化时间信息。**2. 创建who命令文件**
首先,在Linux系统中选择一个合适的目录创建who命令文件,可以使用touch命令创建一个空的文件:
“`shell
touch who.c
“`然后,编辑who.c文件:
“`shell
vim who.c
“`**3. 添加头文件和函数原型**
在who.c文件开头,添加必要的头文件和函数原型:
“`c
#include
#include
#include
#include
#include#include void print_user_info(struct passwd* pwd, struct utmp* utmp_entry);
“`**4. 定义函数print_user_info**
根据用户信息结构体passwd和utmp_entry,定义函数print_user_info来打印用户信息:
“`c
void print_user_info(struct passwd* pwd, struct utmp* utmp_entry) {
char* user_id = itoa(utmp_entry->ut_user);
char* user_name = pwd->pw_name;
char* terminal_name = utmp_entry->ut_line;
char* login_time = ctime((time_t*)&(utmp_entry->ut_tv.tv_sec));
char* host_name = utmp_entry->ut_host;printf(“%-10s %-10s %-15s %-20s %-20s\n”, user_name, user_id, terminal_name, login_time, host_name);
}
“`**5. 定义main函数**
在main函数中,调用系统函数获取用户信息和登录信息,并输出结果:
“`c
int main(int argc, char* argv[]) {
struct passwd* pwd;
struct utmp* utmp_entry;// 打开utmp文件
FILE* utmp_file = fopen(“/var/run/utmp”, “r”);
if (utmp_file == NULL) {
perror(“Failed to open /var/run/utmp”);
exit(EXIT_FAILURE);
}// 遍历utmp文件中的每一个utmp_entry
while ((utmp_entry = getutent()) != NULL) {
// 只处理TYPE_USER进程
if (utmp_entry->ut_type == USER_PROCESS) {
// 根据utmp_entry中的ut_user字段,获取passwd结构体
pwd = getpwuid(utmp_entry->ut_user);
if (pwd == NULL) {
perror(“Failed to get passwd struct”);
exit(EXIT_FAILURE);
}// 打印用户信息
print_user_info(pwd, utmp_entry);
}
}// 关闭utmp文件
fclose(utmp_file);return EXIT_SUCCESS;
}
“`**6. 编译和安装who命令**
编译who.c文件并生成可执行文件:
“`shell
gcc who.c -o who
“`将生成的who可执行文件复制到/usr/bin目录下,使其作为系统命令:
“`shell
cp who /usr/bin
“`**7. 测试**
在终端中运行who命令:
“`shell
who
“`会输出当前登录系统的用户信息,包括用户名、用户ID、终端名、登录时间和主机名等。
以上就是编写Linux自带的who命令的方法和操作流程。编写该命令需要一定的系统编程知识和Linux系统的用户信息获取方法。参考该过程,可以编写其他类似的命令或工具。
2年前