.png)
Eu uso telnetlib - Python - para criar um cliente telnet - porta 23 - para se comunicar com um servidor AS/400. comunicação com o comando telnet isso não é problema, mas com o telnetlib 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.
Responder1
A IBM adquiriu o hábito de mudar de nome. É provável que a máquina da qual você está falando não seja realmente um AS/400, que executava o OS/400. A IBM não envia um desde 2000. A linha de produtos foi substituída (ou renomeada, dependendo do seu ponto de vista) pelos sistemas iSeries, que mais tarde se tornou System i, depois i5, mas o sistema operacional ainda era OS/400. A linha de produtos de hardware foi fundida com os sistemas pSeries e tornou-se Power Systems. O sistema operacional tornou-se i5/OS e agora na ú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 muitas vezes continua a chamá-los de AS/400, até mesmo pensando neles como AS/400. Como grupo, esta árvore genealógica de linhas de produtos é frequentemente chamada de sistemas de médio porte da IBM.
Os sistemas de médio porte da IBM empregavam originalmente terminais IBM modelo 5250. Modelos sucessivos ainda usaram o chamado protocolo 5250, que em alguns aspectos é semelhante ao protocolo 3270 usado com mainframes IBM. É um protocolo orientado a blocos, geralmente transmitindo uma tela inteira por vez, e muitas vezes chamado coloquialmente de "tela verde" com base na cor original dos caracteres. Embora seu servidor possa estar configurado para usar telnet VTxxx, isso provavelmente é uma possibilidade remota. Mas o suporte ao TN5250 é quase certo. Tente se conectar com isso.
Responder2
Você não pode tratar a conexão do AS/400 como trataria uma conexão telnet *nix. Em vez de usar read_until(), tente usar read_very_eager() para obter a tela inteira (incluindo sequências de escape ANSI que posicionam o cursor no início do campo "User....") e, em seguida, escreva() exatamente o que você digitaria se você fizesse login manualmente. Também descobri que, para que a tela de login apareça após a conexão, você precisa primeiro escrever um caractere de nova linha. Não tenho 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: tenha em mente que o AS/400 não enviará um caractere EOF no final da tela, então read_all() simplesmente travará e nunca mais retornará. Você poderia tentar usar read_until(), mas como os dados retornados do servidor podem estar divididos e cheios de sequências de escape ANSI, não há garantia de encontrar o que deseja. A solução óbvia parece colocar read_very_eager() em um loop while que termina quando read_very_eager() retorna uma string vazia. No entanto, isso tem seus próprios problemas, pois o servidor pode retornar diversas mensagens de status ou outras telas parciais antes de passar para a próxima tela inteira. A única solução completa provavelmente analisará continuamente os dados retornados pelo servidor e acompanhará a aparência da tela atual (ou seja, emulação de terminal e captura de tela) ou simplesmente adicionar alguns comandos time.sleep() entre a escrita e a leitura.
Responder3
Abaixo estão as perguntas que eu faria em um comentário anexado à sua pergunta. Então percebi que vocêpostagem cruzadaa pergunta para Stack Overflow. Por favor, não cruze a postagem.
Lá descobri que você havia postado umpasta de pastaem um comentário. Isso me levou a mudar meu comentário para uma resposta.
Na caixa de colagem, os prompts do AS/400 mostram espaços entre os pontos. No código da sua pergunta, não há espaços entre os pontos. É provável que colocar espaços lá 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 boa resposta e mais cedo):
Tem certeza de que está enviando os finais de linha corretos para o AS/400?
Qual sistema operacional o AS/400 está executando?
Os prompts de login do 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 logs do AS/400?
Responder4
Experimente o módulo Python Expect( pexpect
). Segue opassmass.pyroteiro como exemplo. Ele também deve ser incluído no módulo pexpect.
Aqui está umnão testadorevisão 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"