Библиотека сайта rus-linux.net
Purchase | Copyright © 2002 Paul Sheer. Click here for copying permissions. | Home |
Next: 35. The LINUX File Up: rute Previous: 33. Sending Faxes   Contents
Subsections
- 34.1 Command-Line Operation
- 34.2 Configuration
- 34.3 Modem Dial
- 34.4
tty
/UUCP Lock Files - 34.5 Debugging
uucp
- 34.6 Using
uux
withexim
- 34.7 Scheduling Dialouts
34.
uucp
and
uux
uucp
is a command to copy a file from one UNIX system to another.
uux
executes a command on another UNIX system, even if that
command is receiving data through stdin on the local system.
uux
is
extremely useful for automating many kinds of distributed functions,
like mail and news.
The
uucp
and
uux
commands both come as part of the
uucp
(Unix-to-Unix Copy) package.
uucp
may sound ridiculous considering the availability of modern
commands like
rcp
,
rsh
, or even FTP transfers
(which accomplish the same thing), but
uucp
has features that
these do not, making it an essential, albeit antiquated, utility. For
instance,
uucp
never executes jobs immediately. It will, for
example, queue a file copy for later processing and then dial the
remote machine during the night to complete the operation.
uucp
predates the Internet: It was originally
used to implement a mail system, using only modems and
telephone lines. It hence has sophisticated protocols for ensuring that
your file/command really does get there, with the
maximum possible fault tolerance and the minimum of
retransmission. This is why it should always be used for
automated tasks wherever there are unreliable (i.e., modem)
connections. The
uucp
version that comes with most LINUX
distributions is called Taylor UUCP after its author.
Especially important is that when a
uucp
operation is interrupted
by a line break, the connection time is not wasted:
uucp
will
not have discarded any partially transmitted data. This means that no
matter how slow or error prone the connection, progress is always made.
Compare this to an SMTP or POP3/IMAP
connection: Any line break halfway
through a large mail message will necessitate that the entire operation to be
restarted from scratch.
34.1 Command-Line Operation
To copy a file from one machine to another, simply enter
|
uucp <filename> <machine>!<path> |
You can also run commands on the remote system, like
|
echo -n 'Hi, this is a short message\n\n-paul' | \ uux - 'cericon!rmail' 'john' |
which runs
rmail
on the remote system
cericon
,
feeding some text to the
rmail
program. Note how you should quote
the
!
character to prevent it from being interpreted by the shell.
(These commands will almost always fail with
permission denied by remote
.
The error will come in a mail message to the user
that ran the command.)
34.2 Configuration
uucp
comes with comprehensive documentation
in HTML format
(
/usr/doc/uucp-
version
/uucp.html
or
/usr/share/
...) on RedHat, and
info
format on Debian and RedHat. Here, I sketch
a basic and typical configuration.
The
uucp
package has a long history of revisions, beginning with
the first modem-based mail networks. The latest GNU editions that
come with LINUX distributions have a configuration file format that
will probably differ from that which old
uucp
hands are used to.
Dialup networks today typically use
uucp
in
combination with normal PPP dialup, probably not using
uucp
's
dial-in facilities at all. For example, if you are deploying a number of remote
hosts that are using modems, these hosts should always use
uucp
to
upload and retrieve mail, rather than POP3/IMAP or straight
SMTP, because of the retransmission problem discussed above.
In other words,
uucp
is really working as an ordinary TCP service,
albeit with far more fault tolerance.
To make
uucp
into a TCP server, place it into
/etc/inetd.conf
as follows
|
uucp stream tcp nowait uucp /usr/sbin/tcpd /usr/lib/uucp/uucico -l |
being also very careful to limit the hosts that can connect
by using the techniques discussed in Chapter 29.
Similarly for
xinetd
, create a file
/etc/xinetd.d/uucp
containing,
5 10 |
service uucp { only_from = 127.0.0.1 192.168.0.0/16 socket_type = stream wait = no user = uucp server = /usr/lib/uucp/uucico server_args = -l disable = no } |
uucp
configuration files are stored under
/etc/uucp/
.
Now we configure a client machine,
machine1.cranzgot.co.za
, to send mail through
server1.cranzgot.co.za
,
where
server1.cranzgot.co.za
is running the
uucico
service
above.
uucp
has an antiquated authentication
mechanism that uses its own
list of users and passwords completely distinct from those of ordinary UNIX
accounts. We must first add a common ``user'' and password to both machines
for authentication purposes. For
machine1.cranzgot.co.za
, we can add to
the file
/etc/uucp/call
the line
|
server1 machine1login pAsSwOrD123 |
which tells
uucp
to use the login
machine1login
whenever trying to speak to
server1
. On
server1.cranzgot.co.za
we can add to the file
/etc/uucp/passwd
the line,
|
machine1login pAsSwOrD123 |
Note that the
uucp
name
server1
was chosen for the
machine
server1.cranzgot.co.za
for convenience.
uucp
names,
however, have nothing to do with domain names.
Next, we need to tell
uucp
about the intentions of
machine1
. Any machine that you might connect to or from
must be listed in the
/etc/uucp/sys
file.
Our entry looks like
5 |
system machine1 call-login * call-password * commands rmail protocol t |
and can have as many entries as we like. The only things
server1
has to know about
machine1
are the user and password
and the preferred protocol. The
*
's mean to look up the user and
password in the
/etc/uucp/passwd
file, and
protocol t
means to use a simple non-error, correcting protocol (as appropriate for
use over TCP). The
commands
option takes a space-separated list
of permitted commands--for security reasons, commands not in
this list cannot be executed. (This is why I stated above that commands
will almost always fail with
permission denied by remote
--they
are usually not listed under
commands
.)
The
/etc/uucp/sys
file on
machine1
will contain:
5 |
system server1 call-login * call-password * time any port TCP address 192.168.3.2 protocol t |
Here
time any
specifies which times of the day
uucp
may make calls
to
server1
. The default is
time Never
. [See the
uucp
documentation under Time Strings for more info.] The option
port TCP
means that we are using a modem named
TCP
to execute the dialout. All
modems are defined in the file
/etc/uucp/port
. We can add our modem entry
to
/etc/uucp/port
as follows,
|
port TCP type tcp |
which clearly is not really a modem at all.
Finally, we can queue a mail transfer job with
|
echo -e 'Hi Jack\n\nHow are you?\n\n-jill" | \ uux - --nouucico 'server1!rmail' 'jack@beanstalk.com' |
and copy a file with
|
uucp --nouucico README 'cericon!/var/spool/uucppublic' |
Note that
/var/spool/uucppublic/
is the only directory
you are allowed access to by default. You should probably keep it this
way for security.
uucico
Although we have queued a job for processing, nothing will transfer until
the program
uucico
(which stands for Unix-to-Unix
copy in copy out) is run. The idea is that both
server1
and
machine1
may have queued a number of jobs; then when
uucico
is running on both machines and talking to each other,
all jobs on both machines are processed in turn, regardless of which
machine initiated the connection.
Usually
uucico
is run from a
crond
script every hour.
(Even having run
uucico
, nothing will transfer if the time
of day does not come within the ranges specified under
time ...
.)
Here we can run
tail -f /var/log/uucp/Log
while running
uucico
manually as follows:
|
uucico --debug 3 --force --system server1 |
The higher the debug level, the more verbose output you will
see in the
Log
file. This will
--force
ably dial the
--system
server1
regardless of when it last dialed
(usually there are constraints on calling soon after a failed call:
--force
overrides this).
If your mail server on
server1
is configured correctly, it
should now have queued the message on the remote side.
34.3 Modem Dial
If you are really going to use
uucp
the old-fashioned way,
you can use
mgetty
to answer
uucp
calls on
server1
by adding the following to your
/etc/inittab
file:
|
S0:2345:respawn:/sbin/mgetty -s 57600 ttyS0 |
And then add the line
|
machine1login uucp machine1login /usr/sbin/uucico -l -u machine1login |
to the file
/etc/mgetty+sendfax/login.config
(
/etc/mgetty/login.config
for Debian). You will then also
have to add a UNIX account
machine1login
with
password
pAsSwOrD123
. This approach works is because
mgetty
and
uucico
have the same login prompt
and password prompt, but
mgetty
uses
/etc/passwd
instead of
/etc/uucp/passwd
to authenticate. Also, for
a modem connection,
protocol t
is error prone:
change it to
protocol g
,
which has small packet sizes
and error correction.
Note that the above configuration also supports faxes, logins, voice, and PPP
(see Section 41.4) on the same modem, because
mgetty
only starts
uucico
if the user name is
machine1login
.
To dial out from
machine1
, you first need to add a
modem device (besides
TCP
) to your
/etc/uucp/port
file:
5 |
port ACU type modem device /dev/ttyS0 dialer mymodem speed 57600 |
ACU
is antiquated terminology
and stands for Automatic Calling Unit (i.e., a
modem). We have to specify the usual types of things for serial ports,
like the device (
/dev/ttyS0
for a modem on COM1) and speed of
the serial line. We also must specify a means to initialize the modem:
the
dialer mymodem
option. A file
/etc/uucp/dial
should
then contain an entry for our type of modem matching ``
mymodem
''
as follows: [This example
assumes that an initialization string
of
AT&F1
is
sufficient. See Section 3.5.]
5 10 |
dialer mymodem chat "" AT&F1\r\d\c OK\r ATDT\D CONNECT chat-fail RING chat-fail NO\sCARRIER chat-fail ERROR chat-fail NO\sDIALTONE chat-fail BUSY chat-fail NO\sANSWER chat-fail VOICE complete \d\d+++\d\dATH\r\c abort \d\d+++\d\dATH\r\c |
More about modems and dialing is covered with
pppd
in
Chapter 41.
With the modem properly specified, we can change our
entry in the
sys
file to
5 |
system server1 call-login * call-password * time any port ACU phone 555-6789 protocol g |
The same
uux
commands should now work over dialup.
34.4
tty
/UUCP Lock Files
I hinted about lock files in Section 33.2. A more detailed explanation follows.
You will have noticed by now that several services use serial devices, and many of them can use the same device at different times. This creates a possible conflict should two services wish to use the same device at the same time. For instance, what if someone wants to send a fax, while another person is dialing in?
The solution is the UUCP lock file. This is a file created by a process
in
/var/lock/
of the
form
LCK..
device that indicates
the serial port is being used by that process. For instance, when running
sendfax
through a modem connected on
/dev/ttyS0
, a file
/var/lock/LCK..ttyS0
suddenly appears.
This is because
sendfax
, along with all other
mgetty
programs, obeys the UUCP lock file convention. The contents
of this file actually contain the process ID of the program using the
serial device, so it is easy to check whether the lock file is bogus. A lock
file of such a dead process is called a stale lock file and
can be removed manually.
34.5 Debugging
uucp
uucp
implementations rarely run smoothly the first time.
Fortunately, you have available a variety of verbose debugging options.
uucico
takes
the
--debug
option to specify the level of debug output. You
should examine the files
/var/log/uucp/Log
,
/var/log/uucp/Debug
,
and
/var/log/uucp/Stats
to get an idea
about what is going on in the background. Also important
is the spool directory
/var/spool/uucp/
. You can
specify
the debugging level with
--debug
level where level
is in the range of
0
through
11
. You can also use
--debug chat
to only see modem communication details. A full description
of other options follows [Credits to the
uucp
documentation.]:
--debug abnormal
- Output debugging messages for abnormal situations, such as recoverable errors.
--debug chat
- Output debugging messages for chat scripts.
--debug handshake
- Output debugging messages for the initial handshake.
--debug uucp
- protocol Output debugging messages for the UUCP session protocol.
--debug proto
- Output debugging messages for the individual link protocols.
--debug port
- Output debugging messages for actions on the communication port.
--debug config
- Output debugging messages while reading the configuration files.
--debug spooldir
- Output debugging messages for actions in the spool directory.
--debug execute
- Output debugging messages whenever another program is executed.
--debug incoming
- List all incoming data in the debugging file.
--debug outgoing
- List all outgoing data in the debugging file.
--debug all
- All of the above.
34.6 Using
uux
with
exim
On
machine1
we would like
exim
to spool all mail through
uucp
. Using
uucp
requires a pipe transport (
exim
transports are
discussed in Section 30.3.2).
exim
merely sends mail through stdin of the
uux
command and then forgets
about it.
uux
is then responsible for executing
rmail
on
server1
. The complete
exim.conf
file is simply as follows.
5 10 15 20 25 30 35 40 |
#################### MAIN CONFIGURATION SETTINGS ##################### log_subject errors_address = admin local_domains = localhost : ${primary_hostname} : machine1 : \ machine1.cranzgot.co.za host_accept_relay = 127.0.0.1 : localhost : ${primary_hostname} : \ machine1 : machine1.cranzgot.co.za never_users = root exim_user = mail exim_group = mail end ###################### TRANSPORTS CONFIGURATION ###################### uucp: driver = pipe user = nobody command = "/usr/bin/uux - --nouucico ${host}!rmail \ ${local_part}@${domain}" return_fail_output = true local_delivery: driver = appendfile file = /var/spool/mail/${local_part} delivery_date_add envelope_to_add return_path_add group = mail mode_fail_narrower = mode = 0660 end ###################### DIRECTORS CONFIGURATION ####################### localuser: driver = localuser transport = local_delivery end ###################### ROUTERS CONFIGURATION ######################### touucp: driver = domainlist route_list = "* server1" transport = uucp end ###################### RETRY CONFIGURATION ########################### * * F,2m,1m end |
On machine
server1
,
exim
must however be running
as a full-blown mail server to properly route the mail elsewhere. Of
course, on
server1
,
rmail
is the sender; hence, it appears to
exim
that the mail is coming from the local machine. This means
that no extra configuration is required to support mail coming
from a
uux
command.
Note that you can add further domains to your
route_list
so that your dialouts occur directly to the recipient's machine.
For instance:
5 |
route_list = "machine2.cranzgot.co.za machine2 ; \ machine2 machine2 ; \ machine3.cranzgot.co.za machine3 ; \ machine3 machine3 ; \ * server1" |
You can then add further entries to your
/etc/uucp/sys
file as follows:
5 10 15 |
system machine2 call-login * call-password * time any port ACU phone 555-6789 protocol g system machine3 call-login * call-password * time any port ACU phone 554-3210 protocol g |
The
exim.conf
file on
server1
must also have a
router to get mail back to
machine1
. The router will look like this:
5 10 |
###################### ROUTERS CONFIGURATION ######################### touucp: driver = domainlist route_list = "machine2.cranzgot.co.za machine2 ; \ machine2 machine2 ; \ machine3.cranzgot.co.za machine3 ; \ machine3 machine3" transport = uucp lookuphost: driver = lookuphost transport = remote_smtp end |
This router sends all mail matching our dial-in hosts through the
uucp
transport while all other mail (destined for the Internet)
falls through to the
lookuphost
router.
34.7 Scheduling Dialouts
Above, we used
uucico
only manually.
uucico
does not operate
as a daemon process on its own and must be invoked by
crond
.
All systems that use
uucp
have a
/etc/crontab
entry
or a script under
/etc/cron.hourly
.
A typical
/etc/crontab
for
machine1
might contain:
|
45 * * * * uucp /usr/lib/uucp/uucico --master 40 8,13,18 * * * root /usr/bin/uux -r server1! |
The option
--master
tells
uucico
to loop through
all pending jobs and call any machines for which jobs are queued. It
does this every hour. The second line queues a null command three times
daily for the machine
server1
. This will force
uucico
to
dial out to
server1
at least three times a day on the appearance
of real work to be done. The point of this to pick up any jobs coming
the other way. This process is known as creating a poll file.
Clearly, you can use
uucp
over a TCP link initiated by
pppd
. If a dial link is running in demand mode, a
uucp
call will trigger a dialout and make a straight TCP connection through
to the remote host. A common situation occurs when a number of satellite
systems are dialing an ISP that has no
uucp
facility.
To service the satellite machines, a separate
uucp
server is
deployed that has no modems of its own. The server will have a permanent
Internet connection and listen on TCP for
uucp
transfers.
Next: 35. The LINUX File Up: rute Previous: 33. Sending Faxes   Contents