
Мне интересно, есть ли способ заставить telnet отправлять только \n
, а не \r\n
.
Например, если один процесс прослушивает такой порт, чтобы вывести байты любого полученного трафика:
nc -l 1234 | xxd -c 1
Подключаемся к нему из netcat с помощью nc localhost 1234
и набираем "hi[enter]":
0000000: 68 h
0000001: 69 i
0000002: 0a .
Подключаемся к нему через telnet с помощью telnet localhost 1234
и набираем "hi[enter]"
0000000: 68 h
0000001: 69 i
0000002: 0d .
0000003: 0a .
Telnet отправляет 0x0d0a вместо 0x0a для новой строки. Я понимаю, что это CRLF, а не LF. Он также отправляет CRLF, если я использую ^M
или ^J
.
Я думал, что нашел решение, которое напрямую устраняет эту проблему, используя toggle crlf
, но даже с этой установленной опцией Telnet всегда отправляет \r\n
. Я также пробовал это на разных клиентах telnet, поэтому предполагаю, что я не понимаю, что должно делать переключение.
Есть ли способ отправить просто \n
через telnet, с вводом или как-то иначе?
решение1
Вы можете вести переговорыдвоичный режим. Попав в этот режим, вы не сможете выйти из него. Согласование означает, что telnet
клиент отправит серверу специальную последовательность байтов, которую вам придется игнорировать, если вы не реализуете протокол.
Последующие данные отправляются без изменений, в линейном режиме. Клиент:
$ telnet localhost 1234
Connected to localhost.
Escape character is '^]'.
^]
telnet> set binary
Negotiating binary mode with remote host.
hi
^]
telnet> quit
и сервер
$ nc -l 1234 | xxd -c 1
00000000: ff .
00000001: fd .
00000002: 00 .
00000003: ff .
00000004: fb .
00000005: 00 .
00000006: 68 h
00000007: 69 i
00000008: 0a .
У вашего telnet
клиента может быть возможность начать работу в двоичном режиме, или вы можете сделать запись в~/.telnetrc
localhost
set binary
Вы можете применять двоичный режим независимо в каждом направлении, поэтому вы можете предпочесть set outbinary
.
решение2
Не втелнет, поскольку соответствующий RFC определяет возврат каретки/перевод строки как окончание строки. См.Приложение C в RFC 5198.