У меня появилось желание сделать то же самое несколько лет назад. Я часто использую Cygwin в Windows, и возможность открывать простые единственные окна telnet может быть приятной.
Я не нашел никакого способа сделать это из коробки. В конце концов я скопировал исходный код TELNETD и взломал несколько ключевых частей. Он не делает логин, а принимает только одно соединение.
Это требует, чтобы вы связались с GCC. Я сделал это только в Cygwin, но это должно работать и в Linux. Смотрите исходные DIFFs здесь:
DIFF для telnetd.c
83a84
> int be_promiscuous = 0;
133c134
< int debug = 0;
---
> int debug = 1;
145c146
< 'd', ':', 'h', 'k', 'n', 'S', ':', 'u', ':', 'U',
---
> ':', 'h', 'k', 'n', 'S', ':', 'u', ':', 'U',
169a171
> 'g',
239c241
< case 'd':
---
> /* case 'd':
245,246c247,248
< /* NOTREACHED */
< break;
---
> /* NOTREACHED * /
> break; */
340a343,345
> case 'g':
> be_promiscuous = 1;
> break;
395c400
< if (argc > 1) {
---
> if (argc != 1) {
417a423
> if (!be_promiscuous) inet_aton("127.0.0.1",&sin.sin_addr);
546c552
< fprintf(stderr, "Usage: telnetd");
---
> fprintf(stderr, "Usage: telnetdeasy");
553c559,560
< fprintf(stderr, " [-debug]");
---
> /* fprintf(stderr, " [-debug]"); */
> fprintf(stderr, " [-g]");
585c592
< fprintf(stderr, " [port]\n");
---
> fprintf(stderr, " port\n");
832c839
< * set ttyp line security label
---
> * set ttyp line security label
1177c1184
< if (hostinfo && *IM)
---
> if (*IM)
1447c1454
<
---
>
1523c1530
< ixon = tp->c_iflag & IXON;
---
> ixon = tp->c_iflag & IXON;
DIFF для sys_term.c
42a43,46
> #include <pwd.h>
>
> extern void
> start_shell P((char *, int, char *));
1127c1131
< if (ioctl(t, I_PUSH, "ptem") < 0)
---
> if (ioctl(t, I_PUSH, "ptem") < 0)
1451c1455,1456
< start_login(host, autologin, autoname);
---
> start_shell(host, autologin, autoname);
> /*start_login(host, autologin, autoname);*/
1560a1566,1614
> * start_shell(host, autologin, name)
> *
> * Assuming that we are now running as a child processes, this
> * function will turn us into the login process.
> */
> void
> start_shell(host, autologin, name)
> char *host;
> int autologin;
> char *name;
> {
> char *cp, *st, *ar;
> char **argv;
> char **addarg();
> extern char *getenv();
> struct passwd * uinfo = getpwuid(geteuid());
>
> cp = uinfo ? uinfo->pw_shell : NULL;
> if (!cp || !strlen(cp)) cp = "/bin/sh";
> st = strrchr(cp,'/'); st = st ? st+1 : 0;
> if (!st || !strlen(st)) st = "sh";
>
> strcpy( ar = (char*)malloc(strlen(st)+2), "-");
> strcat(ar,st);
>
> argv = addarg(0, ar);
>
> unsetenv("IFS");
>
> closelog();
>
> /*
> * This sleep(1) is in here so that telnetd can
> * finish up with the tty. There's a race condition
> * the login banner message gets lost...
> */
> sleep(1);
>
> execv(cp, argv);
>
> syslog(LOG_ERR, "%s: %m\n", cp);
> fatalperror(net, cp);
> /*NOTREACHED*/
> }
>
>
>
>
> /*
1669c1723
< } else
---
> } else
2243c2297
<
---
>
Я думаю, это работает только с сетями IPv4. Я удалил опцию «-d» и добавил опцию «-g». Этот хак telnetd принимает один числовой аргумент, который является портом прослушивания. Без аргумента "-g" он связывается с 127.0.0.1, в противном случае он связывается глобально.