当前位置: 技术问答>linux和unix
lastlog文件的问题。
来源: 互联网 发布时间:2015-09-09
本文导语: loastlog是记录最后进入系统的用户的信息,包括登录的时间、登录是否成功等信息。 为什么我用ultraEdit打开,只有 0E A0 F8 41 3A 30 以后就全是00了,没有任何数据保存。 但是我在linux下用lastlog 命令,就能看到很多...
loastlog是记录最后进入系统的用户的信息,包括登录的时间、登录是否成功等信息。
为什么我用ultraEdit打开,只有 0E A0 F8 41 3A 30 以后就全是00了,没有任何数据保存。
但是我在linux下用lastlog 命令,就能看到很多用户登陆的信息,请问这是怎么回事??
为什么我用ultraEdit打开,只有 0E A0 F8 41 3A 30 以后就全是00了,没有任何数据保存。
但是我在linux下用lastlog 命令,就能看到很多用户登陆的信息,请问这是怎么回事??
|
如果你除了root还有其他用户登录过机器的话,比如说guest, uid是500,那么在文件
的500*sizeof(lastlog)=146000处的lastlog的结构里保存着guest的最后一次登录信息。
否则全是零
的500*sizeof(lastlog)=146000处的lastlog的结构里保存着guest的最后一次登录信息。
否则全是零
|
参考:http://w3studi.informatik.uni-stuttgart.de/~bergerfx/studies/unix-programming.html 中的Sparse File部分。
下面的代码在RH7.3下编译运行通过:
==================================================
#include
#include
#include
#include
#include
#include
#include
#include
#include
const char* LASTLOG_FILE = "/var/log/lastlog";
static void print_one(const char* uname, const struct lastlog* log)
{
printf("%s", uname);
if (!log->ll_line[0] && !log->ll_host[0]){
printf(" ** NEVER logged in **n");
}else{
printf(" logged in from %s at %s on %sn",
log->ll_line, log->ll_host, ctime(&log->ll_time));
}
}
static void usage(const char* prog)
{
printf("Usage:%s usernamen", prog);
exit(0);
}
int main(int argc, char* argv[])
{
int user_id;
struct lastlog log;
struct stat statbuf;
FILE* fp;
struct passwd* passwd;
// calculate the offset
if (argc != 2)
usage(argv[0]);
passwd = getpwnam(argv[1]);
if (passwd == NULL){
printf("User [%s] not foundn", argv[1]);
return -1;
}
off_t offset = passwd->pw_uid *sizeof(log);
fp = fopen(LASTLOG_FILE, "rb");
if (fp == NULL) {perror("fopen"); return -1;}
if (fstat (fileno(fp), &statbuf)) {
perror("fstat");
return -1;
}
// check if the file is large enough
if (offset >= statbuf.st_size)
return -1;
// seek to the offset
fseek (fp, offset, SEEK_SET);
// read in the struct
if (fread ((char *) &log, sizeof(lastlog), 1, fp) == 1)
print_one(argv[1], &log);
else
perror (LASTLOG_FILE);
return 0;
}
下面的代码在RH7.3下编译运行通过:
==================================================
#include
#include
#include
#include
#include
#include
#include
#include
#include
const char* LASTLOG_FILE = "/var/log/lastlog";
static void print_one(const char* uname, const struct lastlog* log)
{
printf("%s", uname);
if (!log->ll_line[0] && !log->ll_host[0]){
printf(" ** NEVER logged in **n");
}else{
printf(" logged in from %s at %s on %sn",
log->ll_line, log->ll_host, ctime(&log->ll_time));
}
}
static void usage(const char* prog)
{
printf("Usage:%s usernamen", prog);
exit(0);
}
int main(int argc, char* argv[])
{
int user_id;
struct lastlog log;
struct stat statbuf;
FILE* fp;
struct passwd* passwd;
// calculate the offset
if (argc != 2)
usage(argv[0]);
passwd = getpwnam(argv[1]);
if (passwd == NULL){
printf("User [%s] not foundn", argv[1]);
return -1;
}
off_t offset = passwd->pw_uid *sizeof(log);
fp = fopen(LASTLOG_FILE, "rb");
if (fp == NULL) {perror("fopen"); return -1;}
if (fstat (fileno(fp), &statbuf)) {
perror("fstat");
return -1;
}
// check if the file is large enough
if (offset >= statbuf.st_size)
return -1;
// seek to the offset
fseek (fp, offset, SEEK_SET);
// read in the struct
if (fread ((char *) &log, sizeof(lastlog), 1, fp) == 1)
print_one(argv[1], &log);
else
perror (LASTLOG_FILE);
return 0;
}
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。