Патч для getty и login для настройка таймаута (dial-in getty timeout patch)
Ключевые слова: dial-in, getty, timeout, patch, (найти похожие документы)
Date: Sun, 15 Dec 2002 10:45:03 +0500
From: Eugene Grosbein <Eugene_Grosbein@f1.n5006.z2.fidonet.org>
Newsgroups: ftn.ru.unix.bsd
Subject: Патч для getty и login для настройка таймаута
EG>> getty из линии получил мусор, дал этот мусор login'у в качестве имени,
EG>> login ждет пароля с линии. Ждать будет 300 секунд, это не
EG>> настраивается. Я запатчил getty и login, чтобы можно было настраивать
EG>> из /etc/ttys этот таймаут.
AM> Поделись, что ли где патч посмотpеть. Или так закинь...
AM> Вобщем, я так понял, вышеописанное - это ноpмальное явление. Т.е. нужно
AM> подождать 5 мин. и "само pассосется". Может заодно конфигами поделишься?
В /etc/gettytab создаешь настройку с таймаутом на ввод имени после коннекта.
to#10 это десять секунд на ввод имени. Это штатная фича, работает на
штатном getty.
stdh.115200|115200-baud:\
:np:sp#115200:to#10:
Патченные getty и login идут в /usr/local/bin и /usr/local/libexec
соответственно. Патчи нужны, чтобы менять таймаут на ввод пароля.
В /etc/ttys на порт вешаем патченный getty, который будет запускать
/usr/local/bin/login вместо /usr/bin/login:
ttyd0 "/usr/local/libexec/getty -t 10 stdh.115200" dialup on insecure
Патченный getty принимает параметр -t <timeout> и передает его в login,
а login умеет его принять и использовать для ограничения ввода пароля.
Сам патч ниже. Лучше всего применять так:
mkdir -p pgetty/libexec/getty
mkdir -p pgetty/usr.bin/login
cd pgetty
cp -r /usr/src/libexec/getty libexec/
cp -r /usr/src/usr.bin/login usr.bin/
patch </path/to/patch
cd libexec/getty && make depend && make all install
cd .../../usr.bin/login && make depend && make all install
Сам патч:
Index: libexec/getty/Makefile
RCS file: /usr/local/cvsroot/pgetty/libexec/getty/Makefile,v
retrieving revision 1.1.1.2
retrieving revision 1.2
diff -u -r1.1.1.2 -r1.2
- --- libexec/getty/Makefile 8 May 2002 09:53:37 -0000 1.1.1.2
+++ libexec/getty/Makefile 15 Dec 2002 05:02:20 -0000 1.2
@@ -6,6 +6,7 @@
DPADD= ${LIBUTIL}
LDADD= -lutil
MAN= gettytab.5 ttys.5 getty.8
+BINDIR= /usr/local/libexec
# for the paranoid:
#CFLAGS+= -Wall -Wstrict-prototypes -Wno-unused -Wwrite-strings
Index: libexec/getty/main.c
RCS file: /usr/local/cvsroot/pgetty/libexec/getty/main.c,v
retrieving revision 1.1.1.2
retrieving revision 1.11
diff -u -r1.1.1.2 -r1.11
- --- libexec/getty/main.c 8 May 2002 09:53:37 -0000 1.1.1.2
+++ libexec/getty/main.c 8 May 2002 09:58:22 -0000 1.11
@@ -131,6 +131,7 @@
#define puts Gputs
+static void dying __P((void));
static void dingdong __P((int));
static int getname __P((void));
static void interrupt __P((int));
@@ -151,9 +152,16 @@
jmp_buf timeout;
static void
+dying()
+{
+ syslog(LOG_INFO,"finished");
+}
+
+static void
dingdong(signo)
int signo;
{
+ syslog(LOG_INFO,"alarm after %d",TO);
alarm(0);
longjmp(timeout, 1);
}
@@ -189,11 +197,14 @@
int first_sleep = 1, first_time = 1;
struct rlimit limit;
int rval;
-
+ char* login_timeout=NULL; /* don't specify timeout */
+ /* for login(1) by default */
+
signal(SIGINT, SIG_IGN);
signal(SIGQUIT, SIG_IGN);
openlog("getty", LOG_ODELAY|LOG_CONS|LOG_PID, LOG_AUTH);
+ atexit(&dying);
gethostname(hostname, sizeof(hostname) - 1);
hostname[sizeof(hostname) - 1] = '\0';
if (hostname[0] == '\0')
@@ -210,8 +221,17 @@
gettable("default", defent);
gendefaults();
tname = "default";
+ if(argc > 2 && strcmp(argv[1],"-t") == 0) {
+ login_timeout=argv[2];
+ argc-=2;
+ argv+=2;
+ }
+
if (argc > 1)
tname = argv[1];
+ if(login_timeout!=NULL)
+ syslog(LOG_INFO,"started on %s with timeout %s",
+ tname,login_timeout);
/*
* The following is a work around for vhangup interactions
@@ -276,7 +296,6 @@
}
}
}
-
/* Start with default tty settings */
if (tcgetattr(STDIN_FILENO, &tmode) < 0) {
syslog(LOG_ERR, "tcgetattr %s: %m", ttyn);
@@ -410,8 +429,13 @@
limit.rlim_max = RLIM_INFINITY;
limit.rlim_cur = RLIM_INFINITY;
(void)setrlimit(RLIMIT_CPU, &limit);
- execle(LO, "login", AL ? "-fp" : "-p", name,
+ if(login_timeout)
+ execle(LO, "login", "-t", login_timeout,
+ AL ? "-fp" : "-p", name,
(char *) 0, env);
+ else
+ execle(LO, "login", AL ? "-fp" : "-p", name,
+ (char *) 0, env);
syslog(LOG_ERR, "%s: %m", LO);
exit(1);
}
Index: libexec/getty/pathnames.h
RCS file: /usr/local/cvsroot/pgetty/libexec/getty/pathnames.h,v
retrieving revision 1.1.1.2
retrieving revision 1.3
diff -u -r1.1.1.2 -r1.3
- --- libexec/getty/pathnames.h 8 May 2002 09:53:37 -0000 1.1.1.2
+++ libexec/getty/pathnames.h 8 May 2002 09:58:22 -0000 1.3
@@ -37,4 +37,4 @@
#include <paths.h>
#define _PATH_GETTYTAB "/etc/gettytab"
-#define _PATH_LOGIN "/usr/bin/login"
+#define _PATH_LOGIN "/usr/local/bin/login"
Index: usr.bin/login/Makefile
RCS file: /usr/local/cvsroot/pgetty/usr.bin/login/Makefile,v
retrieving revision 1.1.1.2
retrieving revision 1.2
diff -u -r1.1.1.2 -r1.2
- --- usr.bin/login/Makefile 8 May 2002 10:08:28 -0000 1.1.1.2
+++ usr.bin/login/Makefile 15 Dec 2002 05:02:20 -0000 1.2
@@ -1,6 +1,7 @@
# From: @(#)Makefile 8.1 (Berkeley) 7/19/93
# $FreeBSD: src/usr.bin/login/Makefile,v 1.31.2.2 2001/07/16 07:02:39 markm Exp $
+BINDIR=/usr/local/bin
PROG= login
SRCS= login.c login_access.c login_fbtab.c
MAN= login.1 login.access.5
@@ -9,6 +10,7 @@
DPADD= ${LIBUTIL} ${LIBCRYPT}
LDADD= -lutil -lcrypt
+NOPAM= yes
.if !defined(NOPAM)
CFLAGS+= -DUSE_PAM
Index: usr.bin/login/login.c
RCS file: /usr/local/cvsroot/pgetty/usr.bin/login/login.c,v
retrieving revision 1.1.1.2
retrieving revision 1.4
diff -u -r1.1.1.2 -r1.4
- --- usr.bin/login/login.c 8 May 2002 10:08:28 -0000 1.1.1.2
+++ usr.bin/login/login.c 8 May 2002 10:10:40 -0000 1.4
@@ -183,7 +183,6 @@
exit(0);
}
(void)signal(SIGALRM, timedout);
- (void)alarm(timeout);
(void)setpriority(PRIO_PROCESS, 0, 0);
openlog("login", LOG_ODELAY, LOG_AUTH);
@@ -201,7 +200,7 @@
uid = getuid();
euid = geteuid();
egid = getegid();
- while ((ch = getopt(argc, argv, "fh:p")) != -1)
+ while ((ch = getopt(argc, argv, "fh:pt:")) != -1)
switch (ch) {
case 'f':
fflag = 1;
@@ -250,6 +249,7 @@
case 'p':
pflag = 1;
break;
+ case 't': timeout=atoi(optarg); break;
case '?':
default:
if (!uid)
@@ -258,6 +258,7 @@
}
argc -= optind;
argv += optind;
+ (void)alarm(timeout);
if (*argv) {
username = *argv;