使用Linux添加stu1、stu2、stu3三个普通用户,并使用tail查看创建结果
时间: 2024-09-20 20:06:34 浏览: 185
在Linux系统中,你可以使用`adduser`命令来添加普通用户。以下是向系统中分别添加stu1、stu2和stu3这三个用户的步骤:
1. 打开终端(Terminal)。
2. 对于每个用户名,运行以下命令:
```
sudo adduser stu1
sudo adduser stu2
sudo adduser stu3
```
这里需要输入管理员密码来获得权限。每个命令执行后会提示你设置新用户的密码和其他信息。
3. 添加完用户后,为了确认他们已经成功创建,可以使用`cat /etc/passwd`命令查看整个密码文件,或者直接进入每个用户的家目录查看,如`cd /home/stu1`。然而,更直接的方法是查看`passwd`文件中是否有新增的行,因为`passwd`记录了所有用户的详细信息,包括用户名。
4. 如果你想检查最后添加的用户,可以使用`tail -n 3 /etc/passwd`命令,这将显示`passwd`文件的最后三行,通常包含最新的用户信息。例如:
```
tail -n 3 /etc/passwd
```
结果应该类似于:
```
stu3:x:1002:1002:Stu3 User:/home/stu3:/bin/bash
```
相关问题
1.添加stu1、stu2、stu3三个普通用户,并使用tail查看创建结果
在一些数据库操作或文件系统管理中,如果你想要向一个学生信息表(比如`users`)添加名为stu1、stu2和stu3的新用户,这通常涉及SQL查询在数据库中插入数据,例如在MySQL中:
```sql
INSERT INTO users (username) VALUES ('stu1');
INSERT INTO users (username) VALUES ('stu2');
INSERT INTO users (username) VALUES ('stu3');
-- 使用tail命令查看日志或者最近的记录,假设这是数据库日志文件,如mysql.log
tail mysql.log
```
在Linux的shell环境下,`tail`命令用于显示文件的最后几行,如果`mysql.log`记录了上述插入操作,那么它可能会显示新用户的添加记录。
然而,对于文件系统的普通文本文件,直接创建用户并查看其内容,就像创建新的文本行并在终端中使用`tail`:
```sh
echo "stu1" >> users.txt
echo "stu2" >> users.txt
echo "stu3" >> users.txt
tail users.txt
```
这里`>>`是追加模式,会在文件末尾添加内容。
下面的代码是 linux kernel的代码,请指出其中的错误来: struct student{ int id; char name[20]; struct list_head 1ist; }; static LIST_HEAD(student_list); static DEFINE MUTEX(student_mutex); static int add_student(struct student *stu) { struct student *new_stu = NULL; if(!stu) { printk(KERN_ ERR " Invalid argument\n"); return -EINVAL; } if (stu->id <= 0){ i printk(KERN_ ERR "Invalid id\n"); return -EINVAL; } if(!mutex_trylock(&student_mutex)){ printk(KERN_ INFO "Failed to lock mutex\n"); return-EBUSY; } new_stu = kmalloc(sizeof(struct student), GFP KERNEL); if(!new_ stu) { printk(KERN ERR "Failed to allocate memory\n"); return -ENOMEM; *new_stu= *stu; list_add_ tail(&new_stu->list, &student_list); printk(KERN_ INFO "Added student: id=%d, name-%s\n", stu->id, stu->name); mutex_unlock(&student_mutex); return 0; }
这段代码中有一些错误,具体如下:
1. 结构体 `student` 中的变量 `list` 应该改为 `list_head`,即 `struct list_head list;`。
2. 函数 `add_student` 中定义的指针变量 `new_stu` 没有进行初始化,应该将其初始化为 `NULL`。
3. 函数 `add_student` 中的 `if (!mutex_trylock(&student_mutex))` 应该改为 `if (mutex_trylock(&student_mutex))`,因为函数 `mutex_trylock` 返回值为 0 表示锁已经被占用,非 0 表示成功获取到锁。
4. 函数 `add_student` 中的 `new_stu = kmalloc(sizeof(struct student), GFP KERNEL);` 应该改为 `new_stu = kmalloc(sizeof(struct student), GFP_KERNEL);`,因为 `GFP_KERNEL` 是一个宏定义,需要在代码中使用。
5. 函数 `add_student` 中的 `*new_stu = *stu;` 应该放在 `if(!new_stu)` 的外面,否则会出现没有释放 `new_stu` 的情况。
6. 函数 `add_student` 中的 `list_add_ tail(&new_stu->list, &student_list);` 应该改为 `list_add_tail(&new_stu->list, &student_list);`,因为函数名写错了。
7. 函数 `add_student` 中的 `printk(KERN_ INFO "Added student: id=%d, name-%s\n", stu->id, stu->name);` 应该改为 `printk(KERN_INFO "Added student: id=%d, name-%s\n", new_stu->id, new_stu->name);`,因为要打印的是新添加的学生信息。
修改后的代码如下所示:
```
struct student {
int id;
char name[20];
struct list_head list;
};
static LIST_HEAD(student_list);
static DEFINE_MUTEX(student_mutex);
static int add_student(struct student *stu) {
struct student *new_stu = NULL;
if (!stu) {
printk(KERN_ERR "Invalid argument\n");
return -EINVAL;
}
if (stu->id <= 0) {
printk(KERN_ERR "Invalid id\n");
return -EINVAL;
}
if (!mutex_trylock(&student_mutex)) {
printk(KERN_INFO "Failed to lock mutex\n");
return -EBUSY;
}
new_stu = kmalloc(sizeof(struct student), GFP_KERNEL);
if (!new_stu) {
printk(KERN_ERR "Failed to allocate memory\n");
mutex_unlock(&student_mutex);
return -ENOMEM;
}
*new_stu = *stu;
list_add_tail(&new_stu->list, &student_list);
printk(KERN_INFO "Added student: id=%d, name-%s\n", new_stu->id, new_stu->name);
mutex_unlock(&student_mutex);
return 0;
}
```
阅读全文