last: merge sysvinit last/lastb

Signed-off-by: Ondrej Oprala <ooprala@redhat.com>
Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
Ondrej Oprala 2013-08-06 18:19:37 +02:00 committed by Karel Zak
parent 6f96420666
commit ce60272039
8 changed files with 1503 additions and 505 deletions

View File

@ -92,7 +92,7 @@ dist_bashcompletion_DATA += \
bash-completion/chfn \
bash-completion/chsh
endif
if BUILD_LAST
if BUILD_DEPRECATED_LAST
dist_bashcompletion_DATA += \
bash-completion/last
endif

View File

@ -668,7 +668,6 @@ AC_ARG_ENABLE([most-builds],
AS_IF([test "x$enable_most_builds" = xyes], [
enable_chfn_chsh=yes
enable_elvtune=check
enable_last=yes
enable_line=yes
enable_mesg=yes
enable_newgrp=yes
@ -1062,9 +1061,18 @@ UL_REQUIRES_LINUX([kill])
AM_CONDITIONAL([BUILD_KILL], [test "x$build_kill" = xyes])
AC_ARG_ENABLE([deprecated-last],
AS_HELP_STRING([--enable-deprecated-last], [build old deprecated last]),
[], [enable_deprecated_last=no]
)
UL_BUILD_INIT([deprecated_last])
UL_CONFLICTS_BUILD([last], [deprecated_last], [old deprecated last version])
AM_CONDITIONAL([BUILD_DEPRECATED_LAST], [test "x$build_deprecated_last" = xyes])
AC_ARG_ENABLE([last],
AS_HELP_STRING([--enable-last], [build last]),
[], [enable_last=no]
AS_HELP_STRING([--disable-last], [do not build last]),
[], [enable_last=yes]
)
UL_BUILD_INIT([last])
AM_CONDITIONAL([BUILD_LAST], [test "x$build_last" = xyes])

View File

@ -1,10 +1,24 @@
if BUILD_LAST
usrbin_exec_PROGRAMS += last
dist_man_MANS += login-utils/last.1
dist_man_MANS +=
login-utils/last.1 \
login-utils/lastb.1
last_SOURCES = login-utils/last.c
install-exec-hook-last:
cd $(DESTDIR)$(usrsbin_execdir) && ln -sf last lastb
INSTALL_EXEC_HOOKS += install-exec-hook-last
endif
if BUILD_DEPRECATED_LAST
usrbin_exec_PROGRAMS += last
dist_man_MANS += login-utils/last-deprecated.1
last_SOURCES = login-utils/last-deprecated.c
endif # BUILD_DEPRECATED_LAST
if BUILD_SULOGIN
sbin_PROGRAMS += sulogin

View File

@ -0,0 +1,62 @@
.TH LAST 1 "March 1992" "util-linux" "User Commands"
.SH NAME
last \(em indicate last logins by user or terminal
.SH SYNOPSIS
.ad l
.B last
.RB [ \-\fP\fInumber\fP ]
.RB [ \-f
.IR filename ]
.RB [ \-t
.IR tty ]
.RB [ \-h
.IR hostname ]
.RB [ \-i
.IR address ]
.RB [ \-l ]
.RB [ \-y ]
.RI [ name ...]
.ad b
.SH DESCRIPTION
\fBLast\fP looks back in the \fBwtmp\fP file which records all logins
and logouts for information about a user, a teletype or any group of
users and teletypes. Arguments specify names of users or teletypes of
interest. If multiple arguments are given, the information which
applies to any of the arguments is printed. For example ``\fBlast root
console\fP'' would list all of root's sessions as well as all sessions
on the console terminal. \fBLast\fP displays the sessions of the
specified users and teletypes, most recent first, indicating the times
at which the session began, the duration of the session, and the
teletype which the session took place on. If the session is still
continuing or was cut short by a reboot, \fBlast\fP so indicates.
.LP
The pseudo-user \fBreboot\fP logs in at reboots of the system.
.LP
\fBLast\fP with no arguments displays a record of all logins and
logouts, in reverse order.
.LP
If \fBlast\fP is interrupted, it indicates how far the search has
progressed in \fBwtmp\fP. If interrupted with a quit signal \fBlast\fP
indicates how far the search has progressed so far, and the search
continues.
.SH OPTIONS
.IP \fB\-\fP\fInumber\fP
limit the number of entries displayed to that specified by \fInumber\fP.
.IP "\fB\-f\fP \fIfilename\fP"
Use \fIfilename\fP as the name of the accounting file instead of
.BR /var/log/wtmp .
.IP "\fB\-h\fP \fIhostname\fP"
List only logins from \fIhostname\fP.
.IP "\fB\-i\fP \fIIP address\fP"
List only logins from \fIIP address\fP.
.IP "\fB\-l\fP"
List IP addresses of remote hosts instead of truncated host names.
.IP "\fB\-t\fP \fItty\fP"
List only logins on \fItty\fP.
.IP "\fB\-y\fP"
Also report year of dates.
.SH FILES
/var/log/wtmp \(em login data base
.SH AVAILABILITY
The last command is part of the util-linux package and is available from
ftp://ftp.kernel.org/pub/linux/utils/util-linux/.

View File

@ -0,0 +1,483 @@
/*
* Berkeley last for Linux. Currently maintained by poe@daimi.aau.dk at
* ftp://ftp.daimi.aau.dk/pub/linux/poe/admutil*
*
* Copyright (c) 1987 Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms are permitted
* provided that the above copyright notice and this paragraph are
* duplicated in all such forms and that any documentation,
* advertising materials, and other materials related to such
* distribution and use acknowledge that the software was developed
* by the University of California, Berkeley. The name of the
* University may not be used to endorse or promote products derived
* from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
/* 1999-02-22 Arkadiusz Miśkiewicz <misiek@pld.ORG.PL>
* - added Native Language Support
*/
/* 2001-02-14 Marek Zelem <marek@fornax.sk>
* - using mmap() on Linux - great speed improvement
*/
/*
* This command is deprecated. The utility is in maintenance mode,
* meaning we keep them in source tree for backward compatibility
* only. Do not waste time making this command better, unless the
* fix is about security or other very critical issue.
*
* See Documentation/deprecated.txt for more information.
*/
/*
* last
*/
#include <sys/param.h>
#include <sys/stat.h>
#include <sys/file.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <signal.h>
#include <string.h>
#include <time.h>
#include <utmp.h>
#include <stdio.h>
#include <getopt.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "closestream.h"
#include "pathnames.h"
#include "nls.h"
#include "xalloc.h"
#include "c.h"
#define SECDAY (24*60*60) /* seconds in a day */
#define NO 0 /* false/no */
#define YES 1 /* true/yes */
static struct utmp utmpbuf;
#define HMAX (int)sizeof(utmpbuf.ut_host) /* size of utmp host field */
#define LMAX (int)sizeof(utmpbuf.ut_line) /* size of utmp tty field */
#define NMAX (int)sizeof(utmpbuf.ut_name) /* size of utmp name field */
/* maximum sizes used for printing */
/* probably we want a two-pass version that computes the right length */
#define P_HMAX min(HMAX, 16)
#define P_LMAX min(LMAX, 8)
#define P_NMAX min(NMAX, 16)
typedef struct arg {
char *name; /* argument */
#define HOST_TYPE -2
#define TTY_TYPE -3
#define USER_TYPE -4
#define INET_TYPE -5
int type; /* type of arg */
struct arg *next; /* linked list pointer */
} ARG;
ARG *arglist; /* head of linked list */
typedef struct ttytab {
long logout; /* log out time */
char tty[LMAX + 1]; /* terminal name */
struct ttytab *next; /* linked list pointer */
} TTY;
TTY *ttylist; /* head of linked list */
static long currentout, /* current logout value */
maxrec; /* records to display */
static char *file = _PATH_WTMP; /* wtmp file */
static int doyear = 0; /* output year in dates */
static int dolong = 0; /* print also ip-addr */
static void wtmp(void);
static void addarg(int, char *);
static void hostconv(char *);
static void onintr(int);
static int want(struct utmp *, int);
TTY *addtty(char *);
static char *ttyconv(char *);
int
main(int argc, char **argv) {
int ch;
setlocale(LC_ALL, "");
bindtextdomain(PACKAGE, LOCALEDIR);
textdomain(PACKAGE);
atexit(close_stdout);
while ((ch = getopt(argc, argv, "0123456789yli:f:h:t:")) != -1)
switch((char)ch) {
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
/*
* kludge: last was originally designed to take
* a number after a dash.
*/
if (!maxrec)
maxrec = atol(argv[optind - 1] + 1);
break;
case 'f':
file = optarg;
break;
case 'h':
hostconv(optarg);
addarg(HOST_TYPE, optarg);
break;
case 't':
addarg(TTY_TYPE, ttyconv(optarg));
break;
case 'y':
doyear = 1;
break;
case 'l':
dolong = 1;
break;
case 'i':
addarg(INET_TYPE, optarg);
break;
case '?':
default:
fputs(_("usage: last [-#] [-f file] [-t tty] [-h hostname] [user ...]\n"), stderr);
exit(EXIT_FAILURE);
}
for (argv += optind; *argv; ++argv) {
#define COMPATIBILITY
#ifdef COMPATIBILITY
/* code to allow "last p5" to work */
addarg(TTY_TYPE, ttyconv(*argv));
#endif
addarg(USER_TYPE, *argv);
}
wtmp();
return EXIT_SUCCESS;
}
static char *utmp_ctime(struct utmp *u)
{
time_t t = (time_t) u->ut_time;
return ctime(&t);
}
/*
* print_partial_line --
* print the first part of each output line according to specified format
*/
static void
print_partial_line(struct utmp *bp) {
char *ct;
ct = utmp_ctime(bp);
printf("%-*.*s %-*.*s ", P_NMAX, P_NMAX, bp->ut_name,
P_LMAX, P_LMAX, bp->ut_line);
if (dolong) {
if (bp->ut_addr) {
struct in_addr foo;
foo.s_addr = bp->ut_addr;
printf("%-*.*s ", P_HMAX, P_HMAX, inet_ntoa(foo));
} else {
printf("%-*.*s ", P_HMAX, P_HMAX, "");
}
} else {
printf("%-*.*s ", P_HMAX, P_HMAX, bp->ut_host);
}
if (doyear) {
printf("%10.10s %4.4s %5.5s ", ct, ct + 20, ct + 11);
} else {
printf("%10.10s %5.5s ", ct, ct + 11);
}
}
/*
* wtmp --
* read through the wtmp file
*/
static void
wtmp(void) {
register struct utmp *bp; /* current structure */
register TTY *T; /* tty list entry */
long delta; /* time difference */
char *crmsg = NULL;
char *ct = NULL;
int fd;
struct utmp *utl;
struct stat st;
int utl_len;
int listnr = 0;
int i;
utmpname(file);
{
#if defined(_HAVE_UT_TV)
struct timeval tv;
gettimeofday(&tv, NULL);
utmpbuf.ut_tv.tv_sec = tv.tv_sec;
utmpbuf.ut_tv.tv_usec = tv.tv_usec;
#else
time_t t;
time(&t);
utmpbuf.ut_time = t;
#endif
}
(void)signal(SIGINT, onintr);
(void)signal(SIGQUIT, onintr);
if ((fd = open(file,O_RDONLY)) < 0)
err(EXIT_FAILURE, _("cannot open %s"), file);
fstat(fd, &st);
utl_len = st.st_size;
utl = mmap(NULL, utl_len, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FILE, fd, 0);
if (utl == NULL)
err(EXIT_FAILURE, _("%s: mmap failed"), file);
listnr = utl_len/sizeof(struct utmp);
if(listnr)
ct = utmp_ctime(&utl[0]);
for(i = listnr - 1; i >= 0; i--) {
bp = utl+i;
/*
* if the terminal line is '~', the machine stopped.
* see utmp(5) for more info.
*/
if (!strncmp(bp->ut_line, "~", LMAX)) {
/*
* utmp(5) also mentions that the user
* name should be 'shutdown' or 'reboot'.
* Not checking the name causes e.g. runlevel
* changes to be displayed as 'crash'. -thaele
*/
if (!strncmp(bp->ut_user, "reboot", NMAX) ||
!strncmp(bp->ut_user, "shutdown", NMAX)) {
/* everybody just logged out */
for (T = ttylist; T; T = T->next)
T->logout = -bp->ut_time;
}
currentout = -bp->ut_time;
crmsg = (strncmp(bp->ut_name, "shutdown", NMAX)
? "crash" : "down ");
if (!bp->ut_name[0])
(void)strcpy(bp->ut_name, "reboot");
if (want(bp, NO)) {
ct = utmp_ctime(bp);
if(bp->ut_type != LOGIN_PROCESS) {
print_partial_line(bp);
putchar('\n');
}
if (maxrec && !--maxrec)
return;
}
continue;
}
/* find associated tty */
for (T = ttylist;; T = T->next) {
if (!T) {
/* add new one */
T = addtty(bp->ut_line);
break;
}
if (!strncmp(T->tty, bp->ut_line, LMAX))
break;
}
if (bp->ut_name[0] && bp->ut_type != LOGIN_PROCESS
&& bp->ut_type != DEAD_PROCESS
&& want(bp, YES)) {
print_partial_line(bp);
if (!T->logout)
puts(_(" still logged in"));
else {
if (T->logout < 0) {
T->logout = -T->logout;
printf("- %s", crmsg);
}
else
printf("- %5.5s", ctime(&T->logout)+11);
delta = T->logout - bp->ut_time;
if (delta < SECDAY)
printf(" (%5.5s)\n", asctime(gmtime(&delta))+11);
else
printf(" (%ld+%5.5s)\n", delta / SECDAY, asctime(gmtime(&delta))+11);
}
if (maxrec != -1 && !--maxrec)
return;
}
T->logout = bp->ut_time;
utmpbuf.ut_time = bp->ut_time;
}
munmap(utl,utl_len);
close(fd);
if(ct) printf(_("\nwtmp begins %s"), ct); /* ct already ends in \n */
}
/*
* want --
* see if want this entry
*/
static int
want(struct utmp *bp, int check) {
register ARG *step;
if (check) {
/*
* when uucp and ftp log in over a network, the entry in
* the utmp file is the name plus their process id. See
* etc/ftpd.c and usr.bin/uucp/uucpd.c for more information.
*/
if (!strncmp(bp->ut_line, "ftp", sizeof("ftp") - 1))
bp->ut_line[3] = '\0';
else if (!strncmp(bp->ut_line, "uucp", sizeof("uucp") - 1))
bp->ut_line[4] = '\0';
}
if (!arglist)
return YES;
for (step = arglist; step; step = step->next)
switch(step->type) {
case HOST_TYPE:
if (!strncmp(step->name, bp->ut_host, HMAX))
return YES;
break;
case TTY_TYPE:
if (!strncmp(step->name, bp->ut_line, LMAX))
return YES;
break;
case USER_TYPE:
if (!strncmp(step->name, bp->ut_name, NMAX))
return YES;
break;
case INET_TYPE:
if ((in_addr_t) bp->ut_addr == inet_addr(step->name))
return YES;
break;
default:
abort();
}
return NO;
}
/*
* addarg --
* add an entry to a linked list of arguments
*/
static void
addarg(int type, char *arg) {
register ARG *cur;
cur = xmalloc(sizeof(ARG));
cur->next = arglist;
cur->type = type;
cur->name = arg;
arglist = cur;
}
/*
* addtty --
* add an entry to a linked list of ttys
*/
TTY *
addtty(char *ttyname) {
register TTY *cur;
cur = xmalloc(sizeof(TTY));
cur->next = ttylist;
cur->logout = currentout;
memcpy(cur->tty, ttyname, LMAX);
return(ttylist = cur);
}
/*
* hostconv --
* convert the hostname to search pattern; if the supplied host name
* has a domain attached that is the same as the current domain, rip
* off the domain suffix since that's what login(1) does.
*/
static void
hostconv(char *arg) {
static int first = 1;
static char *hostdot, *name;
char *argdot;
if (!(argdot = strchr(arg, '.')))
return;
if (first) {
first = 0;
name = xgethostname();
if (!name)
err(EXIT_FAILURE, _("gethostname failed"));
hostdot = strchr(name, '.');
}
if (hostdot && !strcmp(hostdot, argdot))
*argdot = '\0';
}
/*
* ttyconv --
* convert tty to correct name.
*/
static char *
ttyconv(char *arg) {
char *mval;
/*
* kludge -- we assume that all tty's end with
* a two character suffix.
*/
if (strlen(arg) == 2) {
/* either 6 for "ttyxx" or 8 for "console" */
mval = xmalloc(8);
if (!strncmp(arg, "co", 2))
(void)strcpy(mval, "console");
else {
(void)strcpy(mval, "tty");
(void)strncpy(mval + 3, arg, 4);
}
return mval;
}
if (!strncmp(arg, "/dev/", sizeof("/dev/") - 1))
return arg + 5;
return arg;
}
/*
* onintr --
* on interrupt, we inform the user how far we've gotten
*/
static void
onintr(int signo) {
char *ct;
ct = utmp_ctime(&utmpbuf);
printf(_("\ninterrupted %10.10s %5.5s \n"), ct, ct + 11);
if (signo == SIGINT)
_exit(EXIT_FAILURE);
fflush(stdout); /* fix required for rsh */
}

View File

@ -1,62 +1,124 @@
.TH LAST 1 "March 1992" "util-linux" "User Commands"
'\" -*- coding: UTF-8 -*-
.\" Copyright (C) 1998-2004 Miquel van Smoorenburg.
.\"
.\" This program is free software; you can redistribute it and/or modify
.\" it under the terms of the GNU General Public License as published by
.\" the Free Software Foundation; either version 2 of the License, or
.\" (at your option) any later version.
.\"
.\" This program is distributed in the hope that it will be useful,
.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
.\" GNU General Public License for more details.
.\"
.\" You should have received a copy of the GNU General Public License
.\" along with this program; if not, write to the Free Software
.\" Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
.\"
.\"{{{}}}
.\"{{{ Title
.TH LAST,LASTB 1 "Jul 31, 2004" "" "Linux System Administrator's Manual"
.\"}}}
.\"{{{ Name
.SH NAME
last \(em indicate last logins by user or terminal
last, lastb \- show listing of last logged in users
.\"}}}
.\"{{{ Synopsis
.SH SYNOPSIS
.ad l
.B last
.RB [ \-\fP\fInumber\fP ]
.RB [ \-f
.IR filename ]
.RB [ \-t
.IR tty ]
.RB [ \-h
.IR hostname ]
.RB [ \-i
.IR address ]
.RB [ \-l ]
.RB [ \-y ]
.RI [ name ...]
.ad b
.RB [ \-R ]
.RB [ \-\fInum\fP ]
.RB "[ \-\fBn\fP \fInum\fP ]"
.RB [ \-adFiowx ]
.RB "[ \-\fBf\fP \fIfile\fP ]"
.RB "[ \-\fBt\fP \fIYYYYMMDDHHMMSS\fP ]"
.RI [ name... ]
.RI [ tty... ]
.br
.B lastb
.RB [ \-R ]
.RB [ \-\fInum\fP ]
.RB "[ \-\fBn\fP \fInum\fP ]"
.RB "[ \-\fBf\fP \fIfile\fP ]"
.RB [ \-adFiowx ]
.RI [ name... ]
.RI [ tty... ]
.\"}}}
.\"{{{ Description
.SH DESCRIPTION
\fBLast\fP looks back in the \fBwtmp\fP file which records all logins
and logouts for information about a user, a teletype or any group of
users and teletypes. Arguments specify names of users or teletypes of
interest. If multiple arguments are given, the information which
applies to any of the arguments is printed. For example ``\fBlast root
console\fP'' would list all of root's sessions as well as all sessions
on the console terminal. \fBLast\fP displays the sessions of the
specified users and teletypes, most recent first, indicating the times
at which the session began, the duration of the session, and the
teletype which the session took place on. If the session is still
continuing or was cut short by a reboot, \fBlast\fP so indicates.
.LP
The pseudo-user \fBreboot\fP logs in at reboots of the system.
.LP
\fBLast\fP with no arguments displays a record of all logins and
logouts, in reverse order.
.LP
If \fBlast\fP is interrupted, it indicates how far the search has
progressed in \fBwtmp\fP. If interrupted with a quit signal \fBlast\fP
indicates how far the search has progressed so far, and the search
continues.
.B Last
searches back through the file \fB/var/log/wtmp\fP (or the file
designated by the \fB\-f\fP flag) and displays a list of all
users logged in (and out) since that file was created. Names of users
and tty's can be given, in which case \fBlast\fP will show only those entries
matching the arguments. Names of ttys can be abbreviated, thus \fBlast
0\fP is the same as \fBlast tty0\fP.
.PP
When \fBlast\fP catches a \s-2SIGINT\s0 signal (generated by the interrupt key,
usually control-C) or a \s-2SIGQUIT\s0 signal (generated by the quit key,
usually control-\e), \fBlast\fP will show how far it has searched through the
file; in the case of the \s-2SIGINT\s0 signal \fBlast\fP will then terminate.
.PP
The pseudo user \fBreboot\fP logs in each time the system is rebooted.
Thus \fBlast reboot\fP will show a log of all reboots since the log file
was created.
.PP
\fBLastb\fP is the same as \fBlast\fP, except that by default it shows a log
of the file \fB/var/log/btmp\fP, which contains all the bad login attempts.
.\"}}}
.\"{{{ Options
.SH OPTIONS
.IP \fB\-\fP\fInumber\fP
limit the number of entries displayed to that specified by \fInumber\fP.
.IP "\fB\-f\fP \fIfilename\fP"
Use \fIfilename\fP as the name of the accounting file instead of
.BR /var/log/wtmp .
.IP "\fB\-h\fP \fIhostname\fP"
List only logins from \fIhostname\fP.
.IP "\fB\-i\fP \fIIP address\fP"
List only logins from \fIIP address\fP.
.IP "\fB\-l\fP"
List IP addresses of remote hosts instead of truncated host names.
.IP "\fB\-t\fP \fItty\fP"
List only logins on \fItty\fP.
.IP "\fB\-y\fP"
Also report year of dates.
.IP "\fB\-f\fP \fIfile\fP"
Tells \fBlast\fP to use a specific file instead of \fB/var/log/wtmp\fP.
.IP \fB\-\fP\fInum\fP
This is a count telling \fBlast\fP how many lines to show.
.IP "\fB\-n\fP \fInum\fP"
The same.
.IP "\fB\-t\fP \fIYYYYMMDDHHMMSS\fP"
Display the state of logins as of the specified time. This is
useful, e.g., to determine easily who was logged in at a particular
time -- specify that time with \fB\-t\fP and look for "still logged
in".
.IP "\fB\-f\fP \fIfile\fP"
Specifies a file to search other than \fB/var/log/wtmp\fP.
.IP \fB\-R\fP
Suppresses the display of the hostname field.
.IP \fB\-a\fP
Display the hostname in the last column. Useful in combination
with the next flag.
.IP \fB\-d\fP
For non-local logins, Linux stores not only the host name of the remote
host but its IP number as well. This option translates the IP number
back into a hostname.
.IP \fB\-F\fP
Print full login and logout times and dates.
.IP \fB\-i\fP
This option is like \fB-d\fP in that it displays the IP number of the remote
host, but it displays the IP number in numbers-and-dots notation.
.IP \fB\-w\fP
Display full user and domain names in the output.
.IP \fB\-x\fP
Display the system shutdown entries and run level changes.
.\"}}}
.SH NOTES
The files \fIwtmp\fP and \fIbtmp\fP might not be found. The system only
logs information in these files if they are present. This is a local
configuration issue. If you want the files to be used, they can be
created with a simple \fBtouch\fP(1) command (for example,
\fItouch /var/log/wtmp\fP).
.\"{{{ Files
.SH FILES
/var/log/wtmp \(em login data base
.SH AVAILABILITY
The last command is part of the util-linux package and is available from
ftp://ftp.kernel.org/pub/linux/utils/util-linux/.
/var/log/wtmp
.br
/var/log/btmp
.\"}}}
.\"{{{ Author
.SH AUTHOR
Miquel van Smoorenburg, miquels@cistron.nl
.\"}}}
.\"{{{ See also
.SH "SEE ALSO"
.BR shutdown (8),
.BR login (1),
.BR init (8)
.\"}}}

File diff suppressed because it is too large Load Diff

1
login-utils/lastb.1 Normal file
View File

@ -0,0 +1 @@
.so man1/last.1