Package: util-linux Version: 2.12p I've created a little patch to allow a loginname like [EMAIL PROTECTED]:1 or [EMAIL PROTECTED] that'll run ssh -p1 [EMAIL PROTECTED] or [EMAIL PROTECTED]
this is not well tested, what are your thoughts of the usefulness (or not of it)? yours, Gürkan <agetty.c.remote.patch>
--- agetty.c.orig 2002-07-29 09:36:42.000000000 +0200 +++ agetty.c 2005-09-17 13:42:20.000000000 +0200 @@ -11,6 +11,8 @@ 1999-05-05 Thorsten Kranzkowski <[EMAIL PROTECTED]> - enable hardware flow control before displaying /etc/issue + 2005-09-17 Guerkan Senguen <[EMAIL PROTECTED]> + - enable remote logins without local account via ssh */ #include <stdio.h> @@ -30,6 +32,8 @@ #include <getopt.h> #include <time.h> #include <sys/file.h> +#include <sys/vt.h> +#include <linux/tty.h> #include "xstrncpy.h" #include "nls.h" @@ -249,11 +253,64 @@ #define debug(s) /* nothing */ #endif +int numtokens(char *str, char delimiter) +{ + int i,c=1; + for(i=0; i<strlen(str); i++) { + if(str[i]==delimiter) c++; + } + return c; +} + +char *gettoken(char *str, int num, char delimiter) +{ + char *ret; + int c; + int p=0; + int last=0; + int slen=strlen(str); + + for(c=0; c<=slen; c++) { + if (c==slen-1+1) { + /*printf("eos(%d/%d)\n",c,slen-1);*/ + p++; + } + if (str[c]==delimiter) { + c++; + p++; + /*printf("%d %d\n",p,c);*/ + if (p==num) break; + last=c; + } + } + /*printf("%d %d: %d %d (%d)\n",p,num,last,c,c-last);*/ + + ret=malloc(c-last+1); /*-1*/ + strncpy(ret,str+last,c-last); + /*ret[c-last-1]='\0';*/ /* -1 */ + if (c-1==slen-1) { + ret[c-last]='\0'; + } else { + ret[c-last-1]='\0'; + } + + if (p!=num) { + /*printf("oops\n");*/ + strcpy(ret,""); + } + return ret; +} + int main(argc, argv) int argc; char **argv; { + char *remoteuser = NULL; + char *remotehost = NULL; + char *remoteport = NULL; + char rport[512] = ""; + char rcommand[512] = ""; char *logname = NULL; /* login name, given to /bin/login */ struct chardata chardata; /* set by get_logname() */ struct termio termio; /* terminal mode bits */ @@ -380,6 +437,32 @@ (void) write(1, "\n", 1); + /* Allow remote logins using ssh [EMAIL PROTECTED]:anotherport] */ + + if (strstr(logname,"@") != NULL) { + remoteuser=gettoken(logname,1,'@'); + remotehost=gettoken(logname,2,'@'); + remoteport=gettoken(logname,2,':'); + + if (strstr(logname,":") != NULL) { + strcpy(rport,"-p"); + strcat(rport,remoteport); + remotehost=gettoken(remotehost,1,':'); + } + + strcat(rcommand,remoteuser); + strcat(rcommand,"@"); + strcat(rcommand,remotehost); + + /* printf("EXECLP ssh %s\n",rcommand); + printf("user %s\n",remoteuser); + printf("host %s\n",remotehost); + printf("port %s\n",remoteport); */ + execlp("ssh", "ssh", rport, rcommand, NULL); + error(_("ssh: can't exec %s: %m"), rcommand); + exit(0); /* quiet GCC */ + } + /* Let the login program take care of password validation. */ (void) execl(options.login, options.login, "--", logname, (char *) 0); @@ -652,6 +735,91 @@ if ((st.st_mode & S_IFMT) != S_IFCHR) error(_("/dev/%s: not a character device"), tty); + /* + * Try to avoid opening a vt that is already open, as this will + * mean that the keyboard will be unusable. + * + * Unfortunately, all the kernel gives us to find out is an ioctl + * for the next available vt. As the kernel doesn't open the vt for + * you with the ioctl, there is still a chance of both processes + * opening the same vt, but this check is far better than nothing at + * all. + * + * The kernel API sucks, and is unusable for this situation. What + * we really need is an ioctl that says 'does anyone _ELSE_ have + * this tty open', and that doesn't exist. Or better yet, the + * kernel really shouldn't allow two processes to have read access + * on the same tty at the same time (other than with dup...) Opens + * of the same tty device shouldn't be able to steal reads from + * each other. + * + * Similar to the check added to gdm. + * + * For now, just turn off this check, restoring the bug that ?dm + * (and the system) occasionally get their keyboard locked out by + * getty showing up after they've taken a vt that inittab says + * goes to a getty. + * Bummer. + * + */ +#if 0 + if (strncmp(tty,"tty",3) == 0) + { + char *end; + int vtno; + + vtno = strtol(tty+3,&end,10); + if (end != tty+3 && *end == '\0' && vtno > 1) + { + int fd; + int newvtno; + int fds[MAX_NR_CONSOLES]; + int vt_cnt = 0; + int i; + + for ( i = 0 ; i < MAX_NR_CONSOLES ; i++ ) + fds[i] = -1; + + if ((fd = open("/dev/tty0", O_WRONLY, 0) ) < 0 + && errno != ENOENT) + error(_("/dev/tty0: cannot open: %m")); + + if (fd >= 0) do + { + if ((ioctl(fd, VT_OPENQRY, &newvtno ) < 0)) + error(_("failed to query next available vt")); + + if (newvtno == -1) + error(_("all vts are in use")); + + if (newvtno > vtno) + error(_("/dev/%s: already in use"), tty); + + if (newvtno < vtno) + { + char vtname[TTY_NAME_MAX+3]; + + sprintf( vtname, "tty%d", newvtno ); + + if ((fds[vt_cnt++] = + open(vtname, O_RDWR|O_NONBLOCK, 0)) < 0) + { + error(_("/dev/%s: cannot open: %m"), tty); + } + } + } while (newvtno != vtno); + + close(fd); + for ( i = 0 ; i < MAX_NR_CONSOLES ; i++ ) + { + if (fds[i] == -1) + break; + close(fds[i]); + } + } + } +#endif + /* Open the tty as standard input. */ (void) close(0); @@ -1055,13 +1223,13 @@ } break; case CTL('U'): - case '@': - cp->kill = ascval; /* set kill character */ +/* case '@': + cp->kill = ascval; // set kill character while (bp > logname) { (void) write(1, erase[cp->parity], 3); bp--; } - break; + break; */ case CTL('D'): exit(0); default: