#!/usr/bin/perl # ---- rpc.pl # Perl5 "rpcinfo -p" script. # This connects to tcp port 111 and send a request. Then receives # data, and output it in rpcinfo-like style. # White_E # http://ttj.virtualave.net/ $|=1; $host = $ARGV[0] || die "usage: $0 \n"; $port = 111; use Socket; socket(S,PF_INET,SOCK_STREAM,getprotobyname('tcp')); $paddr = sockaddr_in($port,inet_aton($host)); connect(S,$paddr) || die "Err: connect()\n"; print "Connected to $host:$port.\n"; select(S);$|=1;select(STDOUT); $req = "\x80\x00\x00\x28\x3a\x33\x83\x44\x00\x00\x00\x00\x00\x00\x00\x02". "\x00\x01\x86\xa0\x00\x00\x00\x02\x00\x00\x00\x04\x00\x00\x00\x00". "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; # $req = # "\x80\x00\x00\x28\x39\x3e\x62\x25\x00\x00\x00\x00\x00\x00\x00\x02". # "\x00\x01\x86\xa0\x00\x00\x00\x02\x00\x00\x00\x04\x00\x00\x00\x00". # "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; # Also this works fine. I don't know official request format... send(S,$req,0); $flag = 0; print "---- header section ----\n"; while (1) { read(S,$p,1); $p=ord($p); printf("%02.x ",$p); $flag++; print "\n" if (($flag % 16) == 0); while ($flag >= 32) { print "---- data section ----\n"; print " program vers proto port service\n"; while (1) { read(S,$q,1); $progno = ord($q) * 16**6; read(S,$q,1); $progno += ord($q) * 16**4; read(S,$q,1); $progno += ord($q) * 16**2; read(S,$q,1); $progno += ord($q); read(S,$q,1);read(S,$q,1);read(S,$q,1);read(S,$q,1); $version = ord($q); read(S,$q,1);read(S,$q,1);read(S,$q,1);read(S,$q,1); if (ord($q)==6) { $proto = "tcp"; } # 0x06 tcp elsif (ord($q)==17) { $proto = "udp"; } # 0x11 udp else { $proto = sprintf("%#2.x",ord($q)); } read(S,$q,1); $portno = ord($q) * 16**6; read(S,$q,1); $portno += ord($q) * 16**4; read(S,$q,1); $portno += ord($q) * 16**2; read(S,$q,1); $portno += ord($q); $service=""; $service="rpcbind" if ($progno==100000); $service="rstatd" if ($progno==100001); $service="rusersd" if ($progno==100002); $service="nfs" if ($progno==100003); $service="mountd" if ($progno==100005); $service="ypbind" if ($progno==100007); $service="walld" if ($progno==100008); $service="rquotad" if ($progno==100011); $service="sprayd" if ($progno==100012); $service="nlockmgr" if ($progno==100021); $service="status" if ($progno==100024); $service="cmsd" if ($progno==100068); $service="ttdbserver" if ($progno==100083); $service="kcms_server" if ($progno==100221); $service="sadmind" if ($progno==100232); $service="cachefsd" if ($progno==100235); printf("%10.d %4.d %s %6.d %s\n", $progno,$version,$proto,$portno,$service); read(S,$q,1);read(S,$q,1);read(S,$q,1);read(S,$q,1); if (ord($q) == 0) { close(S); exit; } else { next; } # It seems that the last 20th byte means whether next data comes or not. # 0x00 seems to mean 'no next data'. # I DON'T KNOW OFFICIAL FORMAT !!!!!!111 } } }