
	Here we set manual_stty on the process so we can do things like
hit ^Z to stop it instead of the ^Z going to the process on the other machine.
	This is to say, normally when you interact with a process STDIN is
put in raw mode so everything you type talks to the process at the other end.
	Picture this. When you telnet somewhere and start a process (top
for example) you are talking to telnet in raw mode. If you press ^Z it
goes through telnet to the shell on the remote machine and the process
at the other end is stopped. Here we're going to make it so raw mode is
never set and when you press ^Z or ^C it will stop/interrupt Expect.
	Also briefly demonstrated is the use of Expect::interconnect(),
a more general/versatile alternative to interact.
	
#!/usr/local/bin/perl

$RSH='/usr/bin/ssh';

$host_to_login_to=shift(@ARGV);

use Expect;

# Debugging anyone?
# $Expect::Log_Stdout=1;
# $Expect::Exp_Internal=1;
# $Expect::Debug=1;

print "Enter password: ";
$|=1;
# First we have to initialize STDIN in to an expect object.
$stdin=Expect->exp_init(\*STDIN);
# Now turn off echoing
$stdin->exp_stty('-echo');
# The easy way to do this is:
#$password=<STDIN>;
#chop $password;
# The somewhat harder way is to use $stdin->expect. This would look like:
#
 ($match_num,$error,$match,$before,$after)=$stdin->expect(undef,"\n");
 $password = $before;
# Turn echo back on
$stdin->exp_stty('echo');
# print that newline that wasn't echoed
print "\n";



#$Expect::Exp_Internal=1;

$rsh=Expect->spawn($RSH,$host_to_login_to);

# Look for a password prompt.
$rsh->expect(30,'-re','word:\s$')||(die"Never got password prompt\n");

print $rsh "$password\r";

# Look for a prompt. Prompt can be # $ > or ] followed by a whitespace.
$prompt  = '[\]\$\>\#]\s$';

# Note the use of -re
$rsh->expect(30,'-re',$prompt)||(die "Never got prompt on host\n");

# Start top
print $rsh "exec top\r";

# We already have an inited handle for STDIN above which we can use.
# We don't just do $rsh->interact because it will go monkeying
# with tty settings by default (set it raw).
$stdin->manual_stty(1);
# Instead we use interconnect directly. 
# The trick here is to make sure:
# 1. Everything listening to a handle is added to its
# listen group.
# 2. Only what you want is jabbering at STDOUT.
# 
# In this case only $rsh will talk to STDOUT so we don't have to 
# change any log_stdout() settings.
$stdin->set_group($rsh);
Expect::interconnect($stdin,$rsh);


