# untested and error checks omitted!!! use IO::Socket::Forwarder; use Socket; use POSIX qw(_exit dup2); my $proxy_pid = fork; unless ($proxy_pid) { socketpair(my $sock_parent, my $sock_child, AF_UNIX, SOCK_STREAM, PF_UNSPEC); my $sspid = fork; unless ($sspid) { my $fn = fileno $sock_child; $fn < 3 and die "bad fileno"; dup2($sock_child, 0); dup2(0, 1); dup2(0, 2); { exec "/bin/bash"; } _exit(1); } close $sock_child; forward_sockets($fd, $sock_parent); _exit(0); }