⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sshlogin.c

📁 C++编写
💻 C
字号:
/* * Author: Tatu Ylonen <ylo@cs.hut.fi> * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland *                    All rights reserved * This file performs some of the things login(1) normally does.  We cannot * easily use something like login -p -h host -f user, because there are * several different logins around, and it is hard to determined what kind of * login the current system has.  Also, we want to be able to execute commands * on a tty. * * As far as I am concerned, the code I have written for this software * can be used freely for any purpose.  Any derived versions of this * software must be clearly marked as such, and if the derived work is * incompatible with the protocol description in the RFC file, it must be * called by a name other than "ssh" or "Secure Shell". * * Copyright (c) 1999 Theo de Raadt.  All rights reserved. * Copyright (c) 1999 Markus Friedl.  All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */#include "includes.h"RCSID("$OpenBSD: sshlogin.c,v 1.5 2002/08/29 15:57:25 stevesk Exp $");#include <util.h>#include <utmp.h>#include "sshlogin.h"#include "log.h"/* * Returns the time when the user last logged in.  Returns 0 if the * information is not available.  This must be called before record_login. * The host the user logged in from will be returned in buf. */u_longget_last_login_time(uid_t uid, const char *logname,    char *buf, u_int bufsize){	struct lastlog ll;	char *lastlog;	int fd;	lastlog = _PATH_LASTLOG;	buf[0] = '\0';	fd = open(lastlog, O_RDONLY);	if (fd < 0)		return 0;	lseek(fd, (off_t) ((long) uid * sizeof(ll)), SEEK_SET);	if (read(fd, &ll, sizeof(ll)) != sizeof(ll)) {		close(fd);		return 0;	}	close(fd);	if (bufsize > sizeof(ll.ll_host) + 1)		bufsize = sizeof(ll.ll_host) + 1;	strncpy(buf, ll.ll_host, bufsize - 1);	buf[bufsize - 1] = 0;	return ll.ll_time;}/* * Records that the user has logged in.  I these parts of operating systems * were more standardized. */voidrecord_login(pid_t pid, const char *ttyname, const char *user, uid_t uid,    const char *host, struct sockaddr * addr, socklen_t addrlen){	int fd;	struct lastlog ll;	char *lastlog;	struct utmp u;	/* Construct an utmp/wtmp entry. */	memset(&u, 0, sizeof(u));	strncpy(u.ut_line, ttyname + 5, sizeof(u.ut_line));	u.ut_time = time(NULL);	strncpy(u.ut_name, user, sizeof(u.ut_name));	strncpy(u.ut_host, host, sizeof(u.ut_host));	login(&u);	lastlog = _PATH_LASTLOG;	/* Update lastlog unless actually recording a logout. */	if (strcmp(user, "") != 0) {		/*		 * It is safer to bzero the lastlog structure first because		 * some systems might have some extra fields in it (e.g. SGI)		 */		memset(&ll, 0, sizeof(ll));		/* Update lastlog. */		ll.ll_time = time(NULL);		strncpy(ll.ll_line, ttyname + 5, sizeof(ll.ll_line));		strncpy(ll.ll_host, host, sizeof(ll.ll_host));		fd = open(lastlog, O_RDWR);		if (fd >= 0) {			lseek(fd, (off_t) ((long) uid * sizeof(ll)), SEEK_SET);			if (write(fd, &ll, sizeof(ll)) != sizeof(ll))				log("Could not write %.100s: %.100s", lastlog, strerror(errno));			close(fd);		}	}}/* Records that the user has logged out. */voidrecord_logout(pid_t pid, const char *ttyname){	const char *line = ttyname + 5;	/* /dev/ttyq8 -> ttyq8 */	if (logout(line))		logwtmp(line, "", "");}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -