Posso executar um telnetd one-shot sem prompt de login?

0

Em outras palavras, eu quero algo como telnetd que eu inicio do meu shell para ligar a um IP específico e atender uma conexão. Eu não quero um prompt de login.

Basicamente eu quero que outra máquina execute alguns comandos nesta máquina. Está diretamente conectado, então não quero senhas ou criptografia. Além disso, não possui teclado ou SSH instalado.

    
por Pepijn 08.10.2012 / 13:24

2 respostas

2

Eu desenvolvi o desejo de fazer a mesma coisa há alguns anos. Eu uso muito o Cygwin no Windows e ser capaz de abrir simples janelas telnet de disparo único pode ser bom.

Eu não encontrei nenhuma maneira de fazer isso pronto para uso. Eventualmente, eu copiei a fonte do TELNETD e hackeei algumas partes fundamentais. Ele não faz login e só aceita uma conexão.

Isso requer que você mexa com o GCC. Eu só fiz isso no cygwin, mas também deveria funcionar no linux. Veja os DIFFs de origem aqui:

DIFF para 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 para 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
<
---
>

Isso só funciona com redes IPv4, eu acho. Excluí a opção "-d" e adicionei uma opção "-g". Este hack do telnetd recebe um único argumento numérico, que é a porta de escuta. Sem o argumento "-g", liga-se a 127.0.0.1, caso contrário, ele se liga globalmente.

    
por 08.10.2012 / 23:28
0

No MacOS, você pode executar

/ usr / libexec / telnetd -debug -U 10023

Isso lhe dará uma sessão única na porta 10023, ainda que com login. De acordo com a manpage, supõe-se que haja um parâmetro -a para credenciais (fornecendo -a nenhum), mas isso não parece funcionar aqui, embora possa funcionar no Linux (você não especificou qual sistema operacional está usando).

    
por 08.10.2012 / 20:19

Tags