Now that was rather simple. Nevertheless, you might want to automate the steps previously described. It would be much better to have a simple command that performs all the steps necessary to open the serial device, cause the modem to dial the provider, log in, enable the SLIP line discipline, and configure the network interface. This is what the dip command is for.
dip means Dialup IP. It was
written by Fred van Kempen and has been patched very heavily by a
number of people. Today there is one strain that is used by almost
dip337p-uri, which is included
with most modern Linux distributions, or is available from the
metalab.unc.edu FTP archive.
dip provides an interpreter for a simple scripting language that can handle the modem for you, convert the line to SLIP mode, and configure the interfaces. The script language is powerful enough to suit most configurations.
To be able to configure the SLIP interface, dip requires root privilege. It would now be tempting to make dip setuid to root so that all users can dial up some SLIP server without having to give them root access. This is very dangerous, though, because setting up bogus interfaces and default routes with dip may disrupt routing on your network. Even worse, this action would give your users power to connect to any SLIP server and launch dangerous attacks on your network. If you want to allow your users to fire up a SLIP connection, write small wrapper programs for each prospective SLIP server and have these wrappers invoke dip with the specific script that establishes the connection. Carefully written wrapper programs can then safely be made setuid to root. An alternative, more flexible approach is to give trusted users root access to dip using a program like sudo.
Assume that the host to which we make our SLIP connection is
cowslip, and that we have
written a script for dip to run called
cowslip.dip that makes our connection. We invoke
dip with the script name as argument:
dip cowslip.dipDIP: Dialup IP Protocol Driver version 3.3.7 (12/13/93) Written by Fred N. van Kempen, MicroWalt Corporation. connected to cowslip.moo.com with addr 192.168.5.74 #
The script itself is shown in Example 7.1.
Example 7-1. A Sample dip Script
# Sample dip script for dialing up cowslip # Set local and remote name and address get $local vlager-slip get $remote cowslip port ttyS3 # choose a serial port speed 38400 # set speed to max modem HAYES # set modem type reset # reset modem and tty flush # flush out modem response # Prepare for dialing. send ATQ0V1E1X1\r wait OK 2 if $errlvl != 0 goto error dial 41988 if $errlvl != 0 goto error wait CONNECT 60 if $errlvl != 0 goto error # Okay, we're connected now sleep 3 send \r\n\r\n wait ogin: 10 if $errlvl != 0 goto error send Svlager\n wait ssword: 5 if $errlvl != 0 goto error send knockknock\n wait running 30 if $errlvl != 0 goto error # We have logged in, and the remote side is firing up SLIP. print Connected to $remote with address $rmtip default # Make this link our default route mode SLIP # We go to SLIP mode, too # fall through in case of error error: print SLIP to $remote failed.
After connecting to cowslip
and enabling SLIP, dip will detach from the
terminal and go to the background. You can then start using the normal
networking services on the SLIP link. To terminate the connection,
simply invoke dip with the
-k option. This sends a hangup signal to
dip, using the process ID dip
In dip’s scripting language, keywords prefixed with a dollar
symbol denote variable names. dip has a predefined set of variables, which will be listed below.
$local, for instance, contain the
hostnames of the remote and local hosts involved in the SLIP link.
The first two statements in the sample script are get commands, which is dip’s way to set a variable. Here, the local and remote hostnames are set to vlager and cowslip, respectively.
The next five statements set up the terminal line and the modem.
reset sends a reset string to the modem.
The next statement flushes out the modem response so that the login chat in
the next few lines works properly. This chat is pretty straightforward:
it simply dials 41988, the phone number of
cowslip, and logs in to the account
Svlager using the password
wait command makes dip
wait for the string given as its first argument; the number given as its second
argument makes the wait time out after that many seconds if no such string is
if commands interspersed
in the login procedure check that no error occurred while executing the
The final commands executed after logging in are
default, which makes the SLIP link
the default route to all hosts, and
which enables SLIP mode on the line and configures the interface and routing
table for you.
In this section, we will give a reference for most of
dip’s commands. You can get an overview of all the
commands it provides by invoking dip in test mode
and entering the
command. To learn about the syntax of a command, you may enter it
without any arguments. Remember that this does not work with commands
that take no arguments. The following example illustrates the
dip -tDIP: Dialup IP Protocol Driver version 3.3.7p-uri (25 Dec 96) Written by Fred N. van Kempen, MicroWalt Corporation. Debian version 3.3.7p-2 (debian). DIP>
helpDIP knows about the following commands: beep bootp break chatkey config databits dec default dial echo flush get goto help if inc init mode modem netmask onexit parity password proxyarp print psend port quit reset securidfixed securid send shell skey sleep speed stopbits term timeout wait DIP>
echoUsage: echo on|off DIP>
Throughout the following section, examples that display the DIP> prompt show how to enter a command in test mode and what output it produces. Examples lacking this prompt should be taken as script excerpts.
dip provides a number of commands that configure your serial
line and modem. Some of these are obvious, such as
port, which selects a serial port, and
parity, which set
the common line parameters.
modem command selects a modem type.
Currently, the only type supported is
HAYES (capitalization required).
You have to provide dip with a modem type, or else it will
refuse to execute the
reset commands. The
reset command sends a reset string
to the modem; the string used depends on the modem type selected. For
Hayes-compatible modems, this string is
flush code can be used to flush
out all responses the modem has sent so far. Otherwise, a chat script following
reset might be confused because it reads
OK responses from earlier commands.
init command selects an
initialization string to be passed to the modem before dialing. The
default for Hayes modems is "
ATE0 Q0 V1 X1“, which turns on echoing of commands and long
result codes, and selects blind dialing (no checking of dial
tone). Modern modems have a good factory default configuration, so
this is a little unnecessary, though it does no harm.
dial command sends the
initialization string to the modem and dials up the remote system. The
default dial command for Hayes modems is
echo command serves as a debugging
echo on makes
dip echo to the console everything it sends to
the serial device. This can be turned off again by calling
dip also allows you to leave script mode temporarily and enter terminal mode. In this mode, you can use dip just like any ordinary terminal program, writing the characters you type to the serial line, reading data from the serial line, and displaying the characters. To leave this mode, enter Ctrl-].
get command is
dip’s way of setting a variable. The simplest form is to
set a variable to a constant, as we did in
You may, however, also prompt the user for input by specifying the keyword
ask instead of a value:
get $local askEnter the value for $local: _
A third method is to obtain the value from the remote host.
Bizarre as it seems at first, this is very useful in some cases.
Some SLIP servers will not allow you to use your own IP address on the
SLIP link, but will rather assign you one from a pool of addresses
whenever you dial in, printing some message that informs you about
the address you have been assigned. If the message looks something
Your address: 192.168.5.74“,
the following piece of dip code would let you
pick up the address:
# finish login wait address: 10 get $locip remote
print Using port $port at speed $speedUsing port ttyS3 at speed 38400
dip understands only a predefined set of variables. A variable name always begins with a dollar symbol and must be written in lowercase letters.
$locip variables contain the local host’s
name and IP address. When you store the canonical hostname in
will automatically attempt to resolve the hostname to an IP address
and to store it in the
variable. A similar but backward process occurs when you assign an IP
address to the
variable; dip will attempt to perform a reverse
lookup to identify the name of the host and store it in the
$rmtip variables operate in the same
way for the remote host’s name and address.
$mtu contains the MTU value for
These five variables are the only ones that may be assigned values
directly using the
get command. A
number of other variables are set as a result of the configuration
commands bearing the same name, but may be used in
$errlvl is the variable through which
you can access the result of the last command executed. An error level of 0
indicates success, while a nonzero value denotes an error.
if command is a conditional
branch, rather than a full-featured programming if
statement. Its syntax is:
The expression must be a simple comparison between one of the variables
var must be an integer number; the operator
op may be one of
goto command makes the execution
of the script continue at the line following that bearing the
label. A label must be the first word
on the line and must be followed immediately by a colon.
These commands help implement simple chat scripts in
send command outputs its arguments to the
serial line. It does not support variables, but understands all
C-style backslash character sequences, such as
\n for newline and
\b for backspace. The tilde character (~)
can be used as an abbreviation for carriage return/newline.
wait command takes a word
as an argument and will read all input on the serial line until it
detects a sequence of characters that match this word. The word itself
may not contain any blanks. Optionally, you may give
wait a timeout value as a second argument;
if the expected word is not received within that many seconds, the
command will return with an
$errlvl value of 1. This command is used
to detect login and other prompts.
sleep command may be used to
wait for a certain amount of time; for instance, to patiently wait for any
login sequence to complete. Again, the interval is specified in seconds.
These commands are used to flip the serial line to SLIP mode and configure the interface.
mode command is the last command
executed by dip before going into daemon mode. Unless
an error occurs, the command does not return.
mode takes a protocol name as
argument. dip currently recognizes
TERM as valid names. The current
version of dip does not understand adaptive SLIP, however.
After enabling SLIP mode on the serial line, dip executes ifconfig to configure the interface as a point-to-point link, and invokes route to set the route to the remote host.
If, in addition, the script executes the
default command before
mode, dip creates a
default route that points to the SLIP link.
 diplogin must be run as setuid to root, too. See the section at the end of this chapter.