Написание telnet-клиента

HI,

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

Мне нужно написать программу на C, которая скрывает от клиента аспект telnet и вместо этого предоставляет пользователю интерфейс для управления устройством.

Что было бы хорошим способом продолжить. Я попытался написать простую программу сокетов, но она останавливается при входе в систему. Я предполагаю, что я не следую протоколу TCP.

Кто-нибудь пытался это сделать, есть ли библиотека с открытым исходным кодом для этого?

Спасибо

Дополнение: в конце концов я хочу открыть его через веб-API/веб-сервис. Платформа линукс.


person MAC    schedule 25.03.2010    source источник
comment
Будет ли эта программа работать в Windows? линукс? Если окна, вы можете использовать winsock. В Linux вы наверняка могли бы использовать что-то эквивалентное.   -  person Nate    schedule 26.03.2010
comment
Связанный вопрос: Использование telnet в программе C stackoverflow.com/ вопросы/202859/использование-telnet-в-ac-программе   -  person jfs    schedule 26.03.2010


Ответы (9)


Если Python является вариантом, вы можете использовать telnetlib.

Пример кода:

#!/usr/bin/env python
import getpass
import sys
import telnetlib

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

tn = telnetlib.Telnet(HOST)

tn.read_until("login: ")
tn.write(user + "\n")
if password:
    tn.read_until("Password: ")
    tn.write(password + "\n")

tn.write("ls\n")
tn.write("exit\n")

print tn.read_all()
person compie    schedule 25.03.2010
comment
На данный момент это кажется наиболее удобным способом продвижения вперед. Я устал от быстрого сценария, прочитав онлайн-документацию, и он работает! Теперь все, что мне нужно сделать, это изучить Python, что не кажется таким уж сложным! Интересно, могу ли я общаться между Python и другими программами C? - person MAC; 26.03.2010

Протокол telnet довольно прост... вы просто создаете TCP-соединение и отправляете и получаете данные ASCII. Вот и все.

Таким образом, все, что вам действительно нужно сделать, это создать программу, которая подключается через TCP, затем считывает символы из сокета TCP и анализирует их для обновления графического интерфейса и/или записывает символы в сокет в ответ на действия пользователя, манипулирующие элементами управления в графическом интерфейсе.

То, как вы это реализуете, во многом зависит от того, какое программное обеспечение вы используете для создания своего интерфейса. Со стороны TCP будет достаточно простого цикла обработки событий вокруг select().

person Jeremy Friesner    schedule 25.03.2010
comment
Правда, я пробовал некоторые, но столкнулся с проблемами. Поэтому я надеялся найти готовую библиотеку. - person MAC; 26.03.2010
comment
неправильно, реальный протокол telnet намного сложнее (тип терминала, согласование параметров и т. д.... см. RFC 854). но подавляющее большинство плохо реализованных клиентов telnet представляют собой простые сокеты ASCII. - person Adrien Plisson; 26.03.2010
comment
Хорошая точка зрения; Однако я не думаю, что MAC нужно беспокоиться об этих складках для своих целей. - person Jeremy Friesner; 26.03.2010

Хотя telnet — это почти просто сокет, привязанный к терминалу, это не совсем так. Я считаю, что могут быть некоторые управляющие символы, которые передаются вскоре после установления соединения. Если ваше устройство отправляет какие-то неожиданные управляющие данные, возможно, это сбивает с толку вашу программу. Если вы еще этого не сделали, скачайте wireshark (или tshark, или tcpdump) и следите за своим соединением. Wireshark (ранее ethereal) является кроссплатформенным и довольно простым в использовании для простых задач. Фильтр с tcp.port == 23

person nategoose    schedule 26.03.2010

Это может оказаться полезным для вас.

person Nate    schedule 25.03.2010

Я действительно считаю Руководство Beej по сетевому программированию хорошим введением в сетевое программирование на C.

person Frank    schedule 26.03.2010

Загрузите исходный код Putty. Изучите TELNET.C, серверную часть Telnet для Putty.

person systempuntoout    schedule 25.03.2010
comment
Изучение Putty было бы похоже на чтение технических характеристик двигателя внутреннего сгорания в попытке понять, как водить машину. Что нужно MAC, так это простой пример сокетов и протокола Telnet. - person Dave Jarvis; 26.03.2010
comment
Я бы скорее сказал, что Putty — это клиент SSH для Windows. - person Tiberiu Ana; 26.03.2010

Если приложение не является тривиальным, лучше начать с того, чтобы выяснить, как вы собираетесь создавать графический интерфейс. Это более важный вопрос, и он будет иметь большее влияние на ваш проект, чем то, как именно вы подключаетесь к устройству через telnet. Сначала вы упоминаете C, но затем начинаете говорить о Python, что заставляет меня поверить, что вы относительно гибки в этом вопросе.

После того, как вы выбрали язык/платформу, поищите библиотеку telnet — вы должны найти что-то разумное, уже реализованное.

person Tiberiu Ana    schedule 26.03.2010
comment
Это разумная оценка! Приложение должно состоять из двух частей: центральный сервер, который фактически будет выполнять все функции управления, и приложение пользовательского интерфейса на базе iPhone, которое пользователи будут использовать для внесения изменений. Лично у меня есть опыт работы с технологиями Microsoft, но я должен делать это, используя бесплатные технологии с открытым исходным кодом. Поэтому я в какой-то степени теряюсь, с чего начать. Мне нужно открыть этот API таким образом, чтобы его могло использовать приложение iphone. На мой взгляд, это что-то вроде веб-сервиса. Я до сих пор не уверен, как мне сделать его без .net =) - person MAC; 26.03.2010

Ознакомьтесь с исходным кодом здесь. Это помогло мне очень понять протокол Telnet.

person sivabudh    schedule 17.06.2010

См. параметры в клиенте telnet: на произвольном сокете прослушивания и нажмите escape], чтобы войти в клиент.

telnet> help
telnet> set ?
person bbaassssiiee    schedule 12.03.2014