In Lab 5, a "dummy" shell was spawned
by your simple daemon since your daemon did not authenticate users. This was
done for security reasons to prevent unauthorized users from accessing your
files. You also used the telnet
command to connect to your daemon.
In this lab, we will be looking at code which implements a more realistic shell
and which investigates the telnet protocol.
Create a new directory for this lab (important so that the tarball does not overwrite vcrec.c, vcsend.c and other files you have created in previous labs). Download and untar the networking code provided by Dr. Marc Thomas using the commands:
wget http://www.cs.csubak.edu/~melissa/cs376-s09/cs376_lab_code.tar.gz tar -xvzf cs376_lab_code.tar.gzThe two files of interest for this lab are
s_sh.c
(the shell
program) and s_tlnt.c
(a verbose telnet client). Compile these
two programs with the following command:
make telnetFor the shell program, you can run the shell with the command
./s_sh
and then interact with the shell using regular
stdin (the keyboard) and stdout (the screen). It is VERY IMPORTANT that you
do NOT compile this in the same directory as Lab 5, to prevent simple daemon
from using this version of s_sh for its shell. This shell is a multi-platform
program which parses commands and command options, runs the commands and
displays the results. This program can parse a few commands such as cd, dir
and pwd. It also supports one * or ? wildcard per line. The comments section
at the top of the file lists more details on the capacity of this shell program.
Some interesting things to look at in the code for s_sh.c
is how
it parses the typed command, how it spawns the system binaries for certain
commands, how it stores a history of typed commands and how it implements
internal commands. This mimics much of what a regular shell program, such as
bash, would do.
The telnet program s_tlnt
is also a multi-platform program. It
gives more information about the telnet process than the regular telnet client
does. The telnet protocol allows one to have a plaintext (unencrypted, SSH by
comparison is encrypted) TCP connection which can support virtual terminals.
It was widely used in the early days of the Internet for logging into remote
sites and is still widely used for debugging other plaintext protocols such as
how we used it for Lab 5.
Some interesting things to look at in the s_tlnt.c
code are
process_esc()
and the commandmode
jump target in
main()
. The process_esc()
function interprets basic
VT100/ANSI escape sequences. VT100 and ANSI are standards to control the
placement of the cursor on a text screen, colors, reverse colors, blinking
text, clearing the screen and other such functionality needed to create basic
text-based graphical interfaces. If you use Pine, you've seen VT100 and ANSI
in action.
The commandmode
jump target can be reached by pressing
CTRL-T (the "escape character") while the program is running. This will bring
up the s_tlnt
prompt. Your connection will still be active
in the background while you give commands to the s_tlnt
program.
You can "close" an active connection, "return" to an active connection, "open"
a new connection, set s_tlnt
parameters, access a "help" screen
and see the "status" at the s_tlnt
prompt. The parameters can
enable features which will give more information about the data being passed
across the network, such as VT100 codes.
The command to start s_tlnt
is:
s_tlnt [-v] [-snoopy] hostname portThe v option will turn on verbose, which will give you detailed information about the execution of the program. You can also set "verbose" or "noverbose" at the
s_tlnt
prompt. The snoopy option activates transparent
mode, which gives information about telnet arbitration and shows all control
and 8bit characters. Telnet arbitration is a negociation process that occurs
between your telnet client and the server to set options such as echoing the
text you type or whether to use half-duplex or full-duplex communication. The
negociation process consists of one side presenting an option (IAC DO)
and the other side either accepting (IAC WILL) or rejecting (IAC WONT)
the option.
You can set "snoopy" or "nosnoopy" at the
s_tlnt
prompt.
s_sh
watch for the SIGCLD (SIG_CHLD) signal?
s_sh
implemented?
s_tlnt -v -snoopy helios 23
. You must
use Helios as Sleipnir does not have a telnet daemon running. Do NOT
actually log in to Helios as that will send your password in plaintext.
Hit CTRL-T and then type "close" when prompted to log in. What do you see?
process_esc
in s_tlnt
, basic ANSI/VT100
support is provided. Read the comments at the start of this function.
How do you think Pine provides a "graphical" text interface using these
escape sequences?
s_tlnt
also contain code to parse a command line?
Hint: Think about when does s_tlnt
provides a shell-like
prompt to the user.