netcat で \r\n で終了するクエリを対話的に入力するにはどうすればよいですか?

netcat で \r\n で終了するクエリを対話的に入力するにはどうすればよいですか?
$ nc example.com 80
GET / HTTP/1.1
Host: example.com 

HTTP/1.1 200 OK
...

動作します。行区切り文字は、0Arequired の代わりにここにあります0D0A

0D0Anetcat で - 区切りのクエリを入力するにはどうすればよいですか?

毎回printf手動で入力して1 回限りのことを実行するか、のような Perl ワンライナーを実装して にパイプするのは簡単ですが、私が見逃している簡単な方法があるでしょうか?\r\ntodosnc

答え1

My には、 stdin でを置き換えるnetcatオプション-Cまたはがあります。--crlf\n\r\n

あるいは、使用している端末によって異なります。私のデフォルト設定は次のように確認できます。

$ 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にパイプして、 をstdin から に変換できます。nc-u\n\r\n

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

unix2dos以下も使用できますstdbuf:

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

関連情報