Понимание сути проблемы
Четкое понимание сути проблемы - большая половина ее решения.
Называем все своими именами
Если вы хотите, чтобы этот обходной путь работал для вас, вам придется
понять, КАК он работает, чтобы, если что-то сломается, вы знали где искать
неисправность.
Первый шаг на пути к пониманию проблемы - присвоить всему соответствующие
названия.
Итак "локальная" - это машина, которая устанавливает соединение, файлы на
ней тоже называются "локальными"; и наоборот - "удаленная" - это машина с
другой стороны соединения.
Проблема
Наша цель - соединить между собой ввод и вывод локального IP-эмулятора,
соответственно, с выводом и вводом удаленного IP-эмулятора
Каналами связи между двумя эмуляторами могут быть либо устройства (обычно
pppd), либо "текущий терминал (tty)". Первый вариант, практически, невозможен
в telnet-соединениях. Второй должен быть достаточно хитрым, потому что,
когда вы запускаете локальный эмулятор из командной строки, он подключен к
текущему tty пользователя, а не к telnet-сессии; если мы захотим открыть
новую сессию (локальную или удаленную) на новом терминале, нам придется
синхронизировать запуск и соединение IP-эмуляторов, иначе мусор одного из
эмуляторов будет восприниматься как команды на другой стороне - это
приведет еще к большему мусору и т.п..
Дополнительные трудности
Чтобы все было хорошо, локальный эмулятор должен позволять создавать
IP-соединения на уровне ядра, то есть, быть pppd. Однако pppd достаточно
глуп - он позволяет создавать соединения только через /dev-устройства или
через текущий tty; это должно быть tty, а не парой потоков (pipe) (как все
было бы просто!). Он подходит для удаленной стороны - он может использовать
tty telnet-сессии; но вот для локальной машины он никак не подходит - он не
может запустить telnet-соединения; должен существовать какой-то обходной
путь.
Telnet работает почти правильно с парой потоков, хотя он
все-таки настаивает на выполнении ioctl с tty, с которым он
взаимодействует; использование telnet без tty тоже не совсем правильно,
потому что на медленных компьютерах соединение будет прерываться (fwprc 0.1
работал правильно на P/MMX 233, один из 6 раз на 6x86-P200+, и вообще не
работал на 486dx2/66).
[Примечание: Если я найду того негодяя (возможно он из фанатов MULTICS, да
и в UNIX должны были найтись пара недоумков, скопировавших глупую идею),
который изобрел принцип "tty"-устройств - запись и чтение производятся с
одним "псевдо"-файлом, вместо того, чтобы иметь одну чистую пару потоков -
Я его задушу!]