Conexão Telnet para um sistema AS400 via telnetlib (Python)

4

Eu uso o telnetlib - Python - para criar um cliente telnet - a porta 23 - para se comunicar com um servidor AS / 400. comunicação com o comando telnet que não é problema, mas com o telnetlib eu não recebo nenhuma mensagem.

Aqui está o meu código:

import getpass
import sys
import telnetlib

HOST = raw_input("HOST : ")
user = raw_input("Enter your remote account: ")
password = getpass.getpass()


try:
    tn = telnetlib.Telnet(HOST)
    tn.read_until("User..... ")
    tn.write(user + "\r")
    tn.read_until("Password..... ")
    tn.write(password + "\r")
    print tn.read_all()
except:
    print "Error"

Obrigado.

    
por DARDAR SAAD 17.12.2013 / 11:04

4 respostas

3

A IBM criou o hábito de mudar nomes. As chances são de que a máquina que você está falando não é verdadeiramente um AS / 400, que rodava o OS / 400. A IBM não envia uma desde 2000. A linha de produtos foi substituída (ou renomeada, dependendo do seu ponto de vista) pelos sistemas iSeries, que mais tarde se tornaram System i, depois i5, mas o SO ainda era o OS / 400. A linha de produtos de hardware foi mesclada com os sistemas pSeries e se tornou Power Systems. O sistema operacional tornou-se i5 / OS e agora, sob a última versão 7.1, é oficialmente "IBM i". A próxima geração de hardware, Pure Systems, também pode executar o IBM i OS. Portanto, é provável que o seu servidor seja, na verdade, um System i ou um Power System, mas a equipe de TI geralmente continua a chamá-los de AS / 400, mesmo pensando neles como AS / 400. Como um grupo, essa árvore genealógica de linhas de produtos é geralmente chamada de sistemas midrange da IBM.

Os sistemas IBM de médio porte originalmente usavam terminais IBM modelo 5250. Modelos sucessivos ainda usam o que é conhecido como protocolo 5250, que, de certa forma, é semelhante ao protocolo 3270 usado com mainframes IBM. É um protocolo orientado a blocos, geralmente transmitindo uma tela inteira de cada vez, e muitas vezes chamado coloquialmente de "tela verde" com base na cor original dos caracteres. Embora o seu servidor possa estar configurado para usar o telnet VTxxx, isso provavelmente é um problema. Mas o suporte TN5250 é quase certo. Tente se conectar com isso.

    
por 20.12.2013 / 07:12
3

Você não pode tratar a conexão do AS / 400 como faria com uma conexão * telnet. Em vez de usar read_until (), tente usar read_very_eager () para obter a tela inteira (incluindo seqüências de escape ANSI que posicionam o cursor no início do campo "User ....") e, em seguida, write () exatamente o que você digitaria se você fosse logar manualmente. Também descobri que, para que a tela de login seja exibida após a conexão, você precisa primeiro escrever um caractere de nova linha. Não faço ideia do porquê disso, mas foi o que funcionou para mim.

import getpass
import sys
import telnetlib

HOST = raw_input("HOST : ")
user = raw_input("Enter your remote account: ")
password = getpass.getpass()


try:
    tn = telnetlib.Telnet(HOST)
    tn.write('\n')
    tn.read_very_eager()
    tn.write(user)
    tn.write('\t')  # tab into the next field
    tn.write(password)
    tn.write('\r')  # 'enter' key
except:
    print "Error"

Uma última coisa: lembre-se de que o AS / 400 não enviará um caractere EOF no final da tela, então read_all () será interrompido e nunca retornará. Você poderia tentar usar o read_until (), mas como os dados retornados do servidor podem estar divididos e cheios de seqüências de escape ANSI, não há garantia de encontrar o que você deseja. A solução óbvia parece colocar read_very_eager () em um loop while terminando quando read_very_eager () retorna uma string vazia. No entanto, isso tem seus próprios problemas, pois o servidor pode retornar várias mensagens de status ou outras telas parciais antes de passar para a próxima tela cheia. A única solução completa provavelmente analisará continuamente os dados retornados pelo servidor e acompanhará a aparência da tela atual (por exemplo, emulação de terminal e captura de tela) ou simplesmente adicionará alguns comandos time.sleep () entre a escrita e a leitura.

    
por 04.02.2014 / 10:16
2

Abaixo estão as perguntas que eu faria em um comentário anexado à sua pergunta. Então percebi que você fez o cruzamento da pergunta ao estouro de pilha. Por favor, não cruze a postagem.

Lá, descobri que você havia postado um depósito em um comentário. Isso me levou a mudar meu comentário para uma resposta.

No seu gerenciador de pasta, os prompts do AS / 400 mostram espaços entre os períodos. No código da sua pergunta, não há espaços entre os pontos. É provável que a colocação de espaços faça com que seu código funcione.

Para a posteridade (fornecer esse tipo de informação antecipadamente aumentará a probabilidade de você receber uma resposta boa e mais cedo):

Tem certeza de que está enviando os finais de linha corretos para o AS / 400?

Qual OS é o AS / 400 em execução?

As solicitações de login telnet do AS / 400 realmente possuem todos esses pontos seguidos por um espaço?

Você espera ver um banner de boas-vindas ou algo semelhante?

O que acontece se você enviar um comando antes do read_all ?

O que dizem os registros no AS / 400?

    
por 18.12.2013 / 03:18
1

Experimente o módulo Python Expect ( pexpect ). Siga o script passmass.py como exemplo. Ele deve ser incluído com o módulo pexpect também.

Aqui está uma revisão não testada do seu script:

import getpass
import pexpect
import sys

HOST = raw_input("HOST : ")
user = raw_input("Enter your remote account: ")
password = getpass.getpass()


try:
    tn = pexpect.spawn('telnet %s'%(HOST))

    tn.logfile = file ("LOG.TXT","wb")

    i = tn.expect([pexpect.TIMEOUT, '[Uu]ser..... '])
    if i == 0: # Timeout
        print 'ERROR!'
        print 'telnet could not login. Here is what telnet said:'
        print tn.before, tn.after
        sys.exit (1)
    tn.sendline(user)
    tn.expect (['[Pp]assword..... '])
    tn.sendline(password)

except:
    print "Error"
    
por 17.12.2013 / 16:17