Другими словами, я хочу, чтобы что-то вроде telnetd я запускал из своей оболочки, чтобы привязать к определенному IP и обслуживать одно соединение. Я не хочу приглашение к входу.

По сути, я хочу, чтобы другая машина выполняла несколько команд на этой машине. Это напрямую связано, поэтому я не хочу пароли или шифрование. Кроме того, на нем не установлена клавиатура или SSH.

2 ответа2

2

У меня появилось желание сделать то же самое несколько лет назад. Я часто использую 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, в противном случае он связывается глобально.

0

Под MacOS вы можете запустить

/usr/libexec/telnetd -debug -U 10023

Это даст вам одноразовый сеанс на порту 10023, хотя и с логином. В соответствии с man-страницей должен быть параметр -a для учетных данных (предоставляющий -a нет), но здесь это не работает, хотя может работать в Linux (вы не указали, какую ОС вы используете).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .