在Linux环境下写一个登录功能和界面,要求登录账号用Linux系统中存在的账号
时间: 2024-04-29 14:20:18 浏览: 115
实现登录界面
好的,我可以为您提供一些思路。首先,需要使用Linux系统提供的账户管理工具,比如说passwd和shadow文件,来验证用户输入的账号和密码是否正确。其次,需要使用Linux系统提供的GUI框架,比如说GTK或Qt,来创建登录界面和对用户输入进行处理。下面是一个简单的示例代码,仅供参考:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <gtk/gtk.h>
#include <fcntl.h>
#include <sys/stat.h>
#define MAX_BUF_SIZE 1024
#define PASSWD_FILE "/etc/passwd"
#define SHADOW_FILE "/etc/shadow"
GtkWidget *username_entry;
GtkWidget *password_entry;
GtkWidget *message_label;
static gboolean login(GtkWidget *widget, gpointer data)
{
char username[MAX_BUF_SIZE];
char password[MAX_BUF_SIZE];
char buf[MAX_BUF_SIZE];
char *p, *q;
int fd, n;
// 获取用户名和密码
strcpy(username, gtk_entry_get_text(GTK_ENTRY(username_entry)));
strcpy(password, gtk_entry_get_text(GTK_ENTRY(password_entry)));
// 打开shadow文件
if ((fd = open(SHADOW_FILE, O_RDONLY)) < 0) {
perror("open shadow file failed");
exit(-1);
}
// 读取shadow文件,验证用户输入的用户名和密码是否正确
while ((n = read(fd, buf, MAX_BUF_SIZE)) > 0) {
buf[n] = '\0';
p = strstr(buf, username);
if (p) {
q = strchr(p, ':');
if (q) {
*q = '\0';
if (strcmp(crypt(password, p), p+strlen(username)+1) == 0) {
gtk_label_set_text(GTK_LABEL(message_label), "登录成功!");
close(fd);
return TRUE;
} else {
gtk_label_set_text(GTK_LABEL(message_label), "密码错误!");
close(fd);
return FALSE;
}
}
}
}
gtk_label_set_text(GTK_LABEL(message_label), "用户不存在!");
close(fd);
return FALSE;
}
int main(int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *hbox;
GtkWidget *vbox;
GtkWidget *login_button;
GtkWidget *quit_button;
gtk_init(&argc, &argv);
// 创建主窗口
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "登录");
gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);
gtk_container_set_border_width(GTK_CONTAINER(window), 10);
// 创建水平布局
hbox = gtk_hbox_new(FALSE, 5);
// 创建垂直布局
vbox = gtk_vbox_new(FALSE, 5);
// 创建用户名输入框
username_entry = gtk_entry_new();
gtk_entry_set_max_length(GTK_ENTRY(username_entry), 50);
gtk_box_pack_start(GTK_BOX(vbox), gtk_label_new("用户名"), FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(vbox), username_entry, FALSE, FALSE, 0);
// 创建密码输入框
password_entry = gtk_entry_new();
gtk_entry_set_max_length(GTK_ENTRY(password_entry), 50);
gtk_entry_set_visibility(GTK_ENTRY(password_entry), FALSE);
gtk_box_pack_start(GTK_BOX(vbox), gtk_label_new("密码"), FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(vbox), password_entry, FALSE, FALSE, 0);
// 创建登录按钮
login_button = gtk_button_new_with_label("登录");
g_signal_connect(G_OBJECT(login_button), "clicked", G_CALLBACK(login), NULL);
// 创建退出按钮
quit_button = gtk_button_new_with_label("退出");
g_signal_connect(G_OBJECT(quit_button), "clicked", G_CALLBACK(gtk_main_quit), NULL);
// 创建消息标签
message_label = gtk_label_new("");
gtk_box_pack_start(GTK_BOX(vbox), message_label, FALSE, FALSE, 0);
// 将用户名输入框、密码输入框、登录按钮和退出按钮添加到水平布局中
gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(hbox), login_button, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(hbox), quit_button, FALSE, FALSE, 0);
// 将水平布局添加到主窗口中
gtk_container_add(GTK_CONTAINER(window), hbox);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
```
注意,这只是一个简单的示例代码,实际的登录功能和界面需要根据具体的需求进行设计和实现。
阅读全文