rloginで通信するプログラムを書いた

google先生に聞いてみた。
セキュリティ的に危険だからとか「聞かんでも知っとる」と言いたくなるようなセキュリティの話が続く。
雰囲気が似ている、telnetのライブラリがオマケで実装してるんじゃないかと、telnetlib rlogin とか探してみたが、芳しい情報は得られず。


そうして、30分ほどgoogle先生と問答した挙げ句、諦めることにした。


で、実装に対してrloginを実際に打ってみて、wiresharkでパケットを見てみた。見て分かったのだが、TCPの513番に繋いでsend/recvを繰り返している、だけ、のように見えた。時々、null(0x00)を送信する必要があるみたいで、stringだけではダメっぽいのだが。


で、結局pythonでえいやっと書いたら、動いてしまった。だいたいこんな感じ。

import socket
import struct

def rlogin_command(ip, port):
    s = socket.open(ip, int(port))
    s.send("hogefuga")
    s.send(struct.pack("B", 0))
    (以下略 / wiresharkで見えたパケットの通りに通信する)

rlogin_command("192.168.0.4", "513")

結論:
struct pack がスゴく便利。
可変長バイト長の受信とか(mallocでチャンクをリストで繋げようかとか)、受信時のタイムアウト(select使うか、スレッドで行くか)とかcで考える時間があれば、pythonだと動く物ができてしまう。たぶん、perlrubyphpでも似たようなもんだと思うけど、もう戻れない。