Как интерактивно ввести \r\n-терминированный запрос в netcat?

Как интерактивно ввести \r\n-терминированный запрос в netcat?
$ nc example.com 80
GET / HTTP/1.1
Host: example.com 

HTTP/1.1 200 OK
...

Это работает, разделитель строк 0Aздесь просто вместо требуемого 0D0A.

Как ввести 0D0Aразделенный -запрос в netcat?

Легко сделать что-то один раз, printfвручную печатая \r\nкаждый раз, или реализовать что todos-то вроде однострочника Perl и передать его в nc, но, может быть, есть какой-то простой способ, который я упускаю?

решение1

У меня netcatесть опция -Cили --crlfдля замены \nна \r\nstdin.

Альтернативно, это зависит от того, какой терминал вы используете. Мои настройки по умолчанию можно увидеть:

$ stty -a
... lnext = ^V; ...

Это показываетбуквально-следующийДля ввода используется символ control-V. Таким образом, ввод control-vс последующим нажатием control-mвставит возврат каретки (в отличие от новой строки, которую вы получаете, нажимая клавишу returnили enter).

решение2

Вы можете передать строку по конвейеру nc:

echo -ne 'GET / HTTP/1.1\r\nHost: example.com\r\n\r\n' | nc example.com 80

Проверить с:

$ echo -ne 'GET / HTTP/1.1\r\nHost: example.com\r\n\r\n' | hd
00000000  47 45 54 20 2f 20 48 54  54 50 2f 31 2e 31 0d 0a  |GET / HTTP/1.1..|
00000010  48 6f 73 74 3a 20 65 78  61 6d 70 6c 65 2e 63 6f  |Host: example.co|
00000020  6d 0d 0a 0d 0a                                    |m....|
00000025

решение3

Вы можете выполнить конвейер sedв ncнебуферизованном режиме ( -u), чтобы преобразовать \nиз stdin в \r\n:

sed -u 's/$/\r/g' | nc localhost 6379

Вы также можете использовать unix2dosс stdbuf:

stdbuf -i0 -o0 -e0 unix2dos | nc localhost 6379

Связанный контент