Substituir o tamanho da tela no linux telnet

1

Aqui está minha situação. Estou desenvolvendo um script perl telnet que usa o Expect para gerar um novo processo telnet e alimentar dados (não interativamente) nele.

Tudo funciona bem quando eu chamo o script de um terminal - no entanto, se eu iniciar o script do cron não consigo fazer login no dispositivo remoto porque a negociação de tamanho de janela falha - como meu cliente envia um tamanho de janela de 0 x 0 em vez de 80x24).

Aparentemente, o telnet obtém esse tamanho de janela do seu master PTY - que não é um TTY, se for chamado pelo cron. Provavelmente o telnet está obtendo essas configurações usando ioctl ou algum mecanismo similar, porque a tentativa de substituir essas configurações por variáveis de ambiente falhou ( ROWS = 200 COLUMNS = 80 teste telnet ).

Eu corri stty do cron e redirecionei a saída para um arquivo. O problema é stty reclama quando é executado a partir do cron: / bin / stty: entrada padrão: argumento inválido

Você conhece alguma maneira de:
1) substituir o número de linhas / colunas telnet envia para o dispositivo remoto
2) inicie um tty e inicie o telnet dentro desse tty (do cron)

Obrigado

    
por Mad_Ady 12.08.2009 / 10:12

3 respostas

1

update - Consegui resolver meu problema usando uma solução alternativa. O módulo expect possui uma função que copia o tamanho de um TTY para o "TTY" atual no qual o telnet é executado. Problema era o padrão TTY era STDIN - que não tem dimensões quando executado a partir do cron. Forcei-o a obter suas dimensões de / dev / tty0:

 # nós estamos correndo de cron ou smth
$ logger- > debug ("configuração do tamanho da janela / dev / tty0 para 80x24:");
 '/ bin / stty -F / dev / tty0 colunas 80 linhas 24';
abre TTY0, "/ dev / tty0" ou morre "Não é possível abrir / dev / tty0: $!";
$ session- > slave- > clone_winsize_from (* TTY0);

    
por 12.08.2009 / 10:42
1

Eu achei este post muito útil enquanto eu corri para o mesmo problema depois de migrar algum código Perl de usar Net :: Telnet para esperar (Expect tem uma saída de depuração extremamente útil em comparação).

No entanto, na minha situação, eu tinha um / dev / tty0 que estava bem trancado (somente o root poderia lê-lo) e eu não queria mudar isso:

crw--w----    1 root     tty        4,   0 Aug 30  2002 /dev/tty0

Eu olhei para a fonte Expect / IO :: Pty / IO :: Tty e acabei hackeando o seguinte - que essencialmente faz a mesma coisa (80 x 24) sem precisar ler de /dev/tty0.

use IO::Tty;
use IO::Tty::Constant;
my $winsize = pack('SSSS', 24, 80, 0, 0);
ioctl($exp->slave(), &IO::Tty::Constant::TIOCSWINSZ, $winsize);
    
por 17.04.2012 / 17:35
0

No início do script:

set columns 80
set rows 24
    
por 12.08.2009 / 14:10

Tags