#!/usr/bin/perl use strict; use warnings; use IO::Socket; use Cwd; my %commands; %commands=( qr/^echo:(.+)$/si => sub{ return "$_[1]\n"; }, qr/^addcmd:(\d+):(.+?)$/si => sub{ my ($socket,$loc,$name)=@_; my $code=''; $socket->read($code,$loc); $code=eval("sub{ $code; }"); my $msg="MSG: $name => $code"; if($code and ref($code) eq 'CODE') { $commands{$name}=$code; } $msg="ERR: ".$@ if($@); return $msg; }, qr/^perl:(\d+)$/si => sub{ my ($socket,$loc)=@_; my $code=''; $socket->read($code,$loc); my $msg="MSG: ".eval($code); $msg="ERR: ".$@ if($@); return $msg; }, qr/^cmd:(.+)$/si => sub{ my ($socket,$cmd)=@_; my $ret="MSG: ".`$cmd`; return $ret."\n"; }, qr/^rfile:(.+)$/si => sub{ open(my $fh, '<:raw', $_[1]) or return "error open $_[1] ($!)"; local $/=undef; return <$fh>; }, qr/^wfile:(\d+):(.+)$/si => sub{ my ($socket,$size,$file)=@_; open(my $fh, '>:raw', $file) or return "ERR: open $file ($!)"; my $buff=''; $socket->read($buff,$size) or return "ERR: read $file ($!)"; print $fh $buff; return "MSG: $file written"; }, qr/^cwd:(.*)$/ => sub{ my ($socket,$dir)=@_; if(length($dir)) { unless(chdir($dir)) { return "ERR chdir $dir ($!)"; } } return getcwd(); }, ); my $socket = IO::Socket::INET->new( Proto => "tcp", PeerAddr => 'localhost', PeerPort => 5678, ); die("NO CONNECTION\n") unless $socket; $socket->autoflush(1); while(my $cmd = <$socket>) { chomp($cmd); my $done=0; my $ret=''; for my $tst (keys(%commands)) { if($cmd=~/$tst/) { $ret=$commands{$tst}->($socket,$1,$2,$3,$4,$5); $done=1; last; } } $ret="ERR: UNKNOWN COMMAND: $cmd\n" unless $done; $ret="MSG: NO RETURN\n" unless length $ret; print $socket length($ret)."\n".$ret; }