Return to BSD News archive
#! rnews 2907 bsd
Path: euryale.cc.adfa.oz.au!newshost.anu.edu.au!harbinger.cc.monash.edu.au!simtel!news.kei.com!eff!news.umbc.edu!cs.umd.edu!news.coop.net!hops.entertain.com!usenet
From: Darryl Watson <dwatson>
Newsgroups: comp.unix.bsd.bsdi.misc
Subject: Trying to simulate a telnet session with PERL
Date: 14 Oct 1995 22:18:05 GMT
Organization: ABWAM, Inc., full service ISP, voice: 1+ 303 730-6050
Lines: 98
Message-ID: <45pcut$kcm@hops.entertain.com>
NNTP-Posting-Host: stout.entertain.com
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
X-Mailer: Mozilla 1.1N (X11; I; BSD/386 uname failed)
X-URL: news:comp.unix.bsd.bsdi.misc
..and having trouble. I've got BSDi 2.0 with patches.
I am trying to open a socket on port 23 of my system using
PERL, but am not getting a login prompt in the resulting
stream. I would expect TELNETD to respond with a login,
but it isn't happening. Maybe I am specifying the wrong
type of service? When I go to other ports, such as daytime,
this script works fine.
When I do a telnet -d and 'set netdata', then 'open <hostname>',
I see lots of telnet control data fly back and forth, just as
specified in the RFCs listed in the TELNETD man page.
Any help or suggestions appreciated!
Here is a copy of the PERL script I am using:
----------------------------------------------------------
#!/usr/bin/perl
($them, $port) = @ARGV;
$port = 7 unless $port;
$them = 'localhost' unless $them;
$AF_INET = 2;
$SOCK_STREAM = 1;
# telnet control codes and options (see RFCs)
$IAC = '\xff';
$GA = '\xf9';
$WILL = '\xfb';
$WONT = '\xfc';
$DO = '\xfd';
$DONT = '\xfe';
$SIG{'INT'} = 'dokill';
sub dokill {
kill $9, $child if $child;
}
$sockaddr = 'S n a4 x8';
chop($hostname = `hostname`);
($name, $aliases, $proto) = getprotobyname('tcp');
($name, $aliases, $port) = getservbyname($port, 'tcp')
unless $port =~ /^\d+$/;;
($name, $aliases, $type, $len, $thisaddr) =
gethostbyname($hostname);
($name, $aliases, $type, $len, $thataddr) = gethostbyname($them);
$this = pack($sockaddr, $AF_INET, 0, $thisaddr);
$that = pack($sockaddr, $AF_INET, $port, $thataddr);
# make the socket filehandle
if (socket(S, $AF_INET, $SOCK_STREAM, $proto)) {
print "socket OK\n";
}
else {
die $!;
}
# give the socket an address
if (bind(S, $this)) {
print "bind OK\n";
}
else {
die $!;
}
# call the server
if (connect(S, $that)) {
print "connect OK\n";
}
else {
die $!;
}
# set socket to be command buffered
select(S); $| = 1; select(STDOUT);
# get the remote daemon's attention
print S "${IAC}${DO}\x03${IAC}${WONT}\x18";
print S "${IAC}${WONT}\x1f${IAC}${WONT}\x20";
print S "${IAC}${WONT}\x21${IAC}${WONT}\x22";
print S "${IAC}${WONT}\x27${IAC}${WONT}\x05";
print S "${IAC}${WONT}\x23\n";
# avoid deadlock by forking
if ($child = fork) {
while(<STDIN>) {
print S;
}
sleep 3;
do dokill();
}