netcatと組み合わせればワンライナーでサーバを立てることができる。
nc -l 8080
コマンドを叩けば、標準入出力がsocketと繋がる。
while true; \
do { echo -e 'HTTP/1.1 200 OK\r\n'; cat test.sh; } |\
nc -l 8080; done
netcatをそのまま使っても、リクエストを解析してレスポンスを返すみたいなことができない。このままだと複雑なことができなくて悲しい。
一部の安全でないnetcatでは -e
オプション というものがあるらしい。これを使えばbashに処理を一任できそう。
しかしデフォルトで入っているncコマンドには -e
がなかった・・・。
$ brew install netcat # GNU netcatをインストール
$ netcat -lp 8080 -e /bin/bash hoge.sh
# こうしたら良いバックドアになる
$ netcat -lp 8080 -e /bin/bash
これを使えば、bashだけでWebサーバ作れるんじゃね?
bash縛りとか楽しそう。
/dev/tcp/{hostname}/{port}
にアクセスすれば、こちらからコネクションを張ることはできるらしいでもlistenはできない
bashはシステムにデフォルトで入っているバージョンを使用する
標準で使えるコマンドはだいたい使用可能 ↑ただし、「プログラミング言語」に属するものはNG(awkやperlはNG)
TCPでlistenするために他のシンプルなコマンド(ncなど)に頼るのはOK(でもhttpdとかはズルいのでダメ)
bashで書かれたライブラリは使ってもOK(結局テンプレートエンジンしか使わなかったけど)
良いものができました🎉
静的な画像ファイルの配信にも対応させて、ウキウキしながらHTML中にimgタグを書いた。
しかし、画像が表示されない。
画像取得時にTCP Connectionがはれていないのが原因でした。
netcatを使った既存の仕組みはこう。
これだと、なにかのリクエストを処理している間は他のリクエストに返事ができない。
(acceptできないのでガン無視状態)
よくあるサーバプロセスなどはこんな感じだと思うけれど、netcatはそういうふうにできていない。
tcpserver(D.J.Bernstein)ならちゃんとaccept後にforkしてくれる。
ようやく写真を表示することができました🎉