Назад | Перейти на главную страницу

Telnet-соединение с системой AS400 через telnetlib (Python)

Я использую telnetlib - Python - для создания клиента telnet - порт 23 - для связи с сервером AS / 400. связь с командой telnet не проблема, но с telnetlib я не получаю никаких сообщений.

Вот мой код:

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"

Спасибо.

Вы не можете обращаться с соединением AS / 400, как с telnet-соединением * nix. Вместо использования read_until () попробуйте использовать read_very_eager (), чтобы получить весь экран (включая escape-последовательности ANSI, которые помещают курсор в начало поля «Пользователь ....»), а затем write () именно то, что вы набираете. если вам нужно было войти в систему вручную. Я также обнаружил, что для отображения экрана входа в систему после подключения вам нужно сначала написать символ новой строки. Понятия не имею, почему это так, но у меня это сработало.

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"

И последнее: имейте в виду, что AS / 400 не отправляет символ EOF в конце экрана, поэтому read_all () просто зависнет и никогда не вернется. Вы можете попробовать использовать read_until (), но поскольку данные, возвращаемые сервером, могут быть разбиты и заполнены escape-последовательностями ANSI, нет гарантии, что вы найдете то, что хотите. Очевидное решение, кажется, помещает read_very_eager () в цикл while, завершающийся, когда read_very_eager () возвращает пустую строку. Однако у этого есть свои проблемы, поскольку сервер может возвращать различные сообщения о состоянии или другие частичные экраны перед переходом к следующему полноэкранному режиму. Единственное полное решение, вероятно, будет непрерывно анализировать данные, возвращаемые сервером, и отслеживать, как выглядит текущий экран (например, эмуляция терминала и очистка экрана), или просто добавлять некоторые команды time.sleep () между записью и чтением.

IBM имеет привычку менять имена. Скорее всего, машина, о которой вы говорите, на самом деле не является AS / 400, на которой работает OS / 400. IBM не поставляла их с 2000 года. Линия продуктов была заменена (или переименована, в зависимости от вашей точки зрения) на системы iSeries, которые позже стали System i, затем i5, но ОС все еще была OS / 400. Линия аппаратных продуктов была объединена с системами pSeries и стала Power Systems. Операционная система стала i5 / OS, и теперь в последней версии 7.1 она официально называется IBM i. Следующее поколение оборудования, Pure Systems, также может работать под управлением ОС IBM i. Так что, скорее всего, ваш сервер на самом деле является System i или Power System, но ИТ-персонал часто продолжает называть их AS / 400, даже считая их AS / 400. В целом это семейное древо линейки продуктов часто называют системами IBM среднего уровня.

В системах среднего уровня IBM изначально использовались терминалы IBM модели 5250. В последующих моделях по-прежнему использовался так называемый протокол 5250, который в некотором смысле похож на протокол 3270, используемый в мэйнфреймах IBM. Это блочно-ориентированный протокол, обычно передающий весь экран за раз, и часто в разговорной речи называется «зеленый экран» на основе исходного цвета символов. Хотя ваш сервер может быть настроен на использование Telnet VTxxx, это, вероятно, маловероятно. Но поддержка TN5250 почти гарантирована. Вместо этого попробуйте подключиться к этому.

Ниже приведены вопросы, которые я собирался задать в комментарии к вашему вопросу. Потом я заметил, что ты перекрестный вопрос к Stack Overflow. Пожалуйста, не отправляйте перекрестные сообщения.

Там я обнаружил, что вы разместили корзина для пасты в комментарии. Это заставило меня изменить свой комментарий на ответ.

В корзине для вставки в подсказках AS / 400 отображаются пробелы между точками. В коде вашего вопроса между точками нет пробелов. Вполне вероятно, что размещение пробелов заставит ваш код работать.


Для потомков (предоставление такой информации заранее повысит вероятность того, что вы получите хороший ответ и раньше):

Вы уверены, что отправляете правильные окончания строк в AS / 400?

Какая ОС работает на AS / 400?

Действительно ли в приглашениях на вход в систему через Telnet AS / 400 есть все эти точки, за которыми следует пробел?

Ожидаете ли вы увидеть приветственный баннер или что-то подобное?

Что произойдет, если вы отправите команду до read_all?

Что говорится в журналах AS / 400?

Попробуйте Python Expect (pexpect) модуль. Следовать passmass.py скрипт в качестве примера. Он также должен быть включен в модуль pexpect.

Вот непроверенный редакция вашего скрипта:

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"