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

Если Вы используете Bash:

type -a php

Который скажет Вам все псевдонимы, функции и исполняемые файлы (которые находятся в Вашем PATH) это "php" относится к.

Что-то подобное будет работать в других оболочках.

Другие команды можно попробовать (кроме того, which) whereis и whence.

4
задан 17 December 2013 в 12:04
4 ответа

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 почти наверняка. Вместо этого попробуйте подключиться к этому.

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

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

3
ответ дан 3 December 2019 в 02:44

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

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

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


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

Вы уверены, что вы '

2
ответ дан 3 December 2019 в 02:44

Попробуйте модуль 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"
1
ответ дан 3 December 2019 в 02:44

Вы не можете обрабатывать соединение 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 () между записью и чтением.

поскольку сервер может возвращать различные сообщения о состоянии или другие частичные экраны, прежде чем перейти к следующему полноэкранному режиму. Единственное полное решение, вероятно, состоит в том, чтобы постоянно анализировать данные, возвращаемые сервером, и отслеживать, как выглядит текущий экран (например, эмуляция терминала и очистка экрана), или просто добавлять команды time.sleep () между записью и чтением.

поскольку сервер может возвращать различные сообщения о состоянии или другие частичные экраны, прежде чем перейти к следующему полноэкранному режиму. Единственное полное решение, вероятно, состоит в том, чтобы постоянно анализировать данные, возвращаемые сервером, и отслеживать, как выглядит текущий экран (например, эмуляция терминала и очистка экрана), или просто добавлять некоторые команды time.sleep () между записью и чтением.

3
ответ дан 3 December 2019 в 02:44

Теги

Похожие вопросы