old-www/LDP/abs/html/communications.html

2344 lines
40 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML
><HEAD
><TITLE
>Communications Commands</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK
REL="HOME"
TITLE="Advanced Bash-Scripting Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="External Filters, Programs and Commands"
HREF="external.html"><LINK
REL="PREVIOUS"
TITLE="File and Archiving Commands"
HREF="filearchiv.html"><LINK
REL="NEXT"
TITLE="Terminal Control Commands"
HREF="terminalccmds.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
SUMMARY="Header navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Advanced Bash-Scripting Guide: </TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="filearchiv.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Chapter 16. External Filters, Programs and Commands</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="terminalccmds.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="COMMUNICATIONS"
></A
>16.6. Communications Commands</H1
><P
>Certain of the following commands find use in
network data transfer and analysis, as well as in
<A
HREF="writingscripts.html#CSPAMMERS"
>chasing spammers</A
>.</P
><P
></P
><DIV
CLASS="VARIABLELIST"
><P
><B
><A
NAME="COMMUNINFO1"
></A
>Information and Statistics</B
></P
><DL
><DT
><A
NAME="HOSTREF"
></A
><B
CLASS="COMMAND"
>host</B
></DT
><DD
><P
>Searches for information about an Internet host by name or
IP address, using DNS.</P
><P
> <TABLE
BORDER="1"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><FONT
COLOR="#000000"
><PRE
CLASS="SCREEN"
><TT
CLASS="PROMPT"
>bash$ </TT
><TT
CLASS="USERINPUT"
><B
>host surfacemail.com</B
></TT
>
<TT
CLASS="COMPUTEROUTPUT"
>surfacemail.com. has address 202.92.42.236</TT
>
</PRE
></FONT
></TD
></TR
></TABLE
>
</P
></DD
><DT
><A
NAME="IPCALCREF"
></A
><B
CLASS="COMMAND"
>ipcalc</B
></DT
><DD
><P
>Displays IP information for a host.
With the <TT
CLASS="OPTION"
>-h</TT
> option,
<B
CLASS="COMMAND"
>ipcalc</B
> does a reverse DNS lookup, finding
the name of the host (server) from the IP address.</P
><P
> <TABLE
BORDER="1"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><FONT
COLOR="#000000"
><PRE
CLASS="SCREEN"
><TT
CLASS="PROMPT"
>bash$ </TT
><TT
CLASS="USERINPUT"
><B
>ipcalc -h 202.92.42.236</B
></TT
>
<TT
CLASS="COMPUTEROUTPUT"
>HOSTNAME=surfacemail.com</TT
>
</PRE
></FONT
></TD
></TR
></TABLE
>
</P
></DD
><DT
><A
NAME="NSLOOKUPREF"
></A
><B
CLASS="COMMAND"
>nslookup</B
></DT
><DD
><P
>Do an Internet <SPAN
CLASS="QUOTE"
>"name server lookup"</SPAN
>
on a host by IP address. This is essentially equivalent
to <B
CLASS="COMMAND"
>ipcalc -h</B
> or <B
CLASS="COMMAND"
>dig -x
</B
>. The command may be run either interactively
or noninteractively, i.e., from within a script.</P
><P
>The <B
CLASS="COMMAND"
>nslookup</B
> command has allegedly
been <SPAN
CLASS="QUOTE"
>"deprecated,"</SPAN
> but it is still useful.</P
><P
> <TABLE
BORDER="1"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><FONT
COLOR="#000000"
><PRE
CLASS="SCREEN"
><TT
CLASS="PROMPT"
>bash$ </TT
><TT
CLASS="USERINPUT"
><B
>nslookup -sil 66.97.104.180</B
></TT
>
<TT
CLASS="COMPUTEROUTPUT"
>nslookup kuhleersparnis.ch
Server: 135.116.137.2
Address: 135.116.137.2#53
Non-authoritative answer:
Name: kuhleersparnis.ch</TT
>
</PRE
></FONT
></TD
></TR
></TABLE
>
</P
></DD
><DT
><A
NAME="DIGREF"
></A
><B
CLASS="COMMAND"
>dig</B
></DT
><DD
><P
><B
CLASS="COMMAND"
>D</B
>omain <B
CLASS="COMMAND"
>I</B
>nformation
<B
CLASS="COMMAND"
>G</B
>roper. Similar to
<B
CLASS="COMMAND"
>nslookup</B
>, <I
CLASS="FIRSTTERM"
>dig</I
> does
an Internet <I
CLASS="FIRSTTERM"
>name server lookup</I
> on a host.
May be run from the command-line or from within a script.</P
><P
>Some interesting options to <I
CLASS="FIRSTTERM"
>dig</I
> are
<TT
CLASS="OPTION"
>+time=N</TT
> for setting a query timeout to
<TT
CLASS="PARAMETER"
><I
>N</I
></TT
> seconds, <TT
CLASS="OPTION"
>+nofail</TT
> for
continuing to query servers until a reply is received, and
<TT
CLASS="OPTION"
>-x</TT
> for doing a reverse address lookup.</P
><P
>Compare the output of <B
CLASS="COMMAND"
>dig -x</B
> with
<B
CLASS="COMMAND"
>ipcalc -h</B
> and
<B
CLASS="COMMAND"
>nslookup</B
>.</P
><P
> <TABLE
BORDER="1"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><FONT
COLOR="#000000"
><PRE
CLASS="SCREEN"
><TT
CLASS="PROMPT"
>bash$ </TT
><TT
CLASS="USERINPUT"
><B
>dig -x 81.9.6.2</B
></TT
>
<TT
CLASS="COMPUTEROUTPUT"
>;; Got answer:
;; -&#62;&#62;HEADER&#60;&#60;- opcode: QUERY, status: NXDOMAIN, id: 11649
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
;; QUESTION SECTION:
;2.6.9.81.in-addr.arpa. IN PTR
;; AUTHORITY SECTION:
6.9.81.in-addr.arpa. 3600 IN SOA ns.eltel.net. noc.eltel.net.
2002031705 900 600 86400 3600
;; Query time: 537 msec
;; SERVER: 135.116.137.2#53(135.116.137.2)
;; WHEN: Wed Jun 26 08:35:24 2002
;; MSG SIZE rcvd: 91</TT
>
</PRE
></FONT
></TD
></TR
></TABLE
>
</P
><P
><A
NAME="SPAMLOOKUP_0"
></A
></P
><DIV
CLASS="EXAMPLE"
><A
NAME="SPAMLOOKUP"
></A
><P
><B
>Example 16-40. Finding out where to report a spammer</B
></P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><FONT
COLOR="#000000"
><PRE
CLASS="PROGRAMLISTING"
>#!/bin/bash
# spam-lookup.sh: Look up abuse contact to report a spammer.
# Thanks, Michael Zick.
# Check for command-line arg.
ARGCOUNT=1
E_WRONGARGS=85
if [ $# -ne "$ARGCOUNT" ]
then
echo "Usage: `basename $0` domain-name"
exit $E_WRONGARGS
fi
dig +short $1.contacts.abuse.net -c in -t txt
# Also try:
# dig +nssearch $1
# Tries to find "authoritative name servers" and display SOA records.
# The following also works:
# whois -h whois.abuse.net $1
# ^^ ^^^^^^^^^^^^^^^ Specify host.
# Can even lookup multiple spammers with this, i.e."
# whois -h whois.abuse.net $spamdomain1 $spamdomain2 . . .
# Exercise:
# --------
# Expand the functionality of this script
#+ so that it automatically e-mails a notification
#+ to the responsible ISP's contact address(es).
# Hint: use the "mail" command.
exit $?
# spam-lookup.sh chinatietong.com
# A known spam domain.
# "crnet_mgr@chinatietong.com"
# "crnet_tec@chinatietong.com"
# "postmaster@chinatietong.com"
# For a more elaborate version of this script,
#+ see the SpamViz home page, http://www.spamviz.net/index.html.</PRE
></FONT
></TD
></TR
></TABLE
></DIV
><P
><A
NAME="ISSPAMMER_0"
></A
></P
><DIV
CLASS="EXAMPLE"
><A
NAME="ISSPAMMER"
></A
><P
><B
>Example 16-41. Analyzing a spam domain</B
></P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><FONT
COLOR="#000000"
><PRE
CLASS="PROGRAMLISTING"
>#! /bin/bash
# is-spammer.sh: Identifying spam domains
# $Id: is-spammer, v 1.4 2004/09/01 19:37:52 mszick Exp $
# Above line is RCS ID info.
#
# This is a simplified version of the "is_spammer.bash
#+ script in the Contributed Scripts appendix.
# is-spammer &#60;domain.name&#62;
# Uses an external program: 'dig'
# Tested with version: 9.2.4rc5
# Uses functions.
# Uses IFS to parse strings by assignment into arrays.
# And even does something useful: checks e-mail blacklists.
# Use the domain.name(s) from the text body:
# http://www.good_stuff.spammer.biz/just_ignore_everything_else
# ^^^^^^^^^^^
# Or the domain.name(s) from any e-mail address:
# Really_Good_Offer@spammer.biz
#
# as the only argument to this script.
#(PS: have your Inet connection running)
#
# So, to invoke this script in the above two instances:
# is-spammer.sh spammer.biz
# Whitespace == :Space:Tab:Line Feed:Carriage Return:
WSP_IFS=$'\x20'$'\x09'$'\x0A'$'\x0D'
# No Whitespace == Line Feed:Carriage Return
No_WSP=$'\x0A'$'\x0D'
# Field separator for dotted decimal ip addresses
ADR_IFS=${No_WSP}'.'
# Get the dns text resource record.
# get_txt &#60;error_code&#62; &#60;list_query&#62;
get_txt() {
# Parse $1 by assignment at the dots.
local -a dns
IFS=$ADR_IFS
dns=( $1 )
IFS=$WSP_IFS
if [ "${dns[0]}" == '127' ]
then
# See if there is a reason.
echo $(dig +short $2 -t txt)
fi
}
# Get the dns address resource record.
# chk_adr &#60;rev_dns&#62; &#60;list_server&#62;
chk_adr() {
local reply
local server
local reason
server=${1}${2}
reply=$( dig +short ${server} )
# If reply might be an error code . . .
if [ ${#reply} -gt 6 ]
then
reason=$(get_txt ${reply} ${server} )
reason=${reason:-${reply}}
fi
echo ${reason:-' not blacklisted.'}
}
# Need to get the IP address from the name.
echo 'Get address of: '$1
ip_adr=$(dig +short $1)
dns_reply=${ip_adr:-' no answer '}
echo ' Found address: '${dns_reply}
# A valid reply is at least 4 digits plus 3 dots.
if [ ${#ip_adr} -gt 6 ]
then
echo
declare query
# Parse by assignment at the dots.
declare -a dns
IFS=$ADR_IFS
dns=( ${ip_adr} )
IFS=$WSP_IFS
# Reorder octets into dns query order.
rev_dns="${dns[3]}"'.'"${dns[2]}"'.'"${dns[1]}"'.'"${dns[0]}"'.'
# See: http://www.spamhaus.org (Conservative, well maintained)
echo -n 'spamhaus.org says: '
echo $(chk_adr ${rev_dns} 'sbl-xbl.spamhaus.org')
# See: http://ordb.org (Open mail relays)
echo -n ' ordb.org says: '
echo $(chk_adr ${rev_dns} 'relays.ordb.org')
# See: http://www.spamcop.net/ (You can report spammers here)
echo -n ' spamcop.net says: '
echo $(chk_adr ${rev_dns} 'bl.spamcop.net')
# # # other blacklist operations # # #
# See: http://cbl.abuseat.org.
echo -n ' abuseat.org says: '
echo $(chk_adr ${rev_dns} 'cbl.abuseat.org')
# See: http://dsbl.org/usage (Various mail relays)
echo
echo 'Distributed Server Listings'
echo -n ' list.dsbl.org says: '
echo $(chk_adr ${rev_dns} 'list.dsbl.org')
echo -n ' multihop.dsbl.org says: '
echo $(chk_adr ${rev_dns} 'multihop.dsbl.org')
echo -n 'unconfirmed.dsbl.org says: '
echo $(chk_adr ${rev_dns} 'unconfirmed.dsbl.org')
else
echo
echo 'Could not use that address.'
fi
exit 0
# Exercises:
# --------
# 1) Check arguments to script,
# and exit with appropriate error message if necessary.
# 2) Check if on-line at invocation of script,
# and exit with appropriate error message if necessary.
# 3) Substitute generic variables for "hard-coded" BHL domains.
# 4) Set a time-out for the script using the "+time=" option
to the 'dig' command.</PRE
></FONT
></TD
></TR
></TABLE
></DIV
><P
>For a much more elaborate version of the above script, see
<A
HREF="contributed-scripts.html#ISSPAMMER2"
>Example A-28</A
>.</P
></DD
><DT
><A
NAME="TRACEROUTEREF"
></A
><B
CLASS="COMMAND"
>traceroute</B
></DT
><DD
><P
>Trace the route taken by packets sent to a remote host. This
command works within a LAN, WAN, or over the
Internet. The remote host may be specified by an IP
address. The output of this command may be filtered
by <A
HREF="textproc.html#GREPREF"
>grep</A
> or <A
HREF="sedawk.html#SEDREF"
>sed</A
> in a pipe.</P
><P
> <TABLE
BORDER="1"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><FONT
COLOR="#000000"
><PRE
CLASS="SCREEN"
><TT
CLASS="PROMPT"
>bash$ </TT
><TT
CLASS="USERINPUT"
><B
>traceroute 81.9.6.2</B
></TT
>
<TT
CLASS="COMPUTEROUTPUT"
>traceroute to 81.9.6.2 (81.9.6.2), 30 hops max, 38 byte packets
1 tc43.xjbnnbrb.com (136.30.178.8) 191.303 ms 179.400 ms 179.767 ms
2 or0.xjbnnbrb.com (136.30.178.1) 179.536 ms 179.534 ms 169.685 ms
3 192.168.11.101 (192.168.11.101) 189.471 ms 189.556 ms *
...</TT
>
</PRE
></FONT
></TD
></TR
></TABLE
>
</P
></DD
><DT
><A
NAME="PINGREF"
></A
><B
CLASS="COMMAND"
>ping</B
></DT
><DD
><P
>Broadcast an <TT
CLASS="REPLACEABLE"
><I
>ICMP
ECHO_REQUEST</I
></TT
> packet to another machine,
either on a local or remote network. This is a
diagnostic tool for testing network connections,
and it should be used with caution.</P
><P
> <TABLE
BORDER="1"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><FONT
COLOR="#000000"
><PRE
CLASS="SCREEN"
><TT
CLASS="PROMPT"
>bash$ </TT
><TT
CLASS="USERINPUT"
><B
>ping localhost</B
></TT
>
<TT
CLASS="COMPUTEROUTPUT"
>PING localhost.localdomain (127.0.0.1) from 127.0.0.1 : 56(84) bytes of data.
64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=0 ttl=255 time=709 usec
64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=1 ttl=255 time=286 usec
--- localhost.localdomain ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/mdev = 0.286/0.497/0.709/0.212 ms</TT
>
</PRE
></FONT
></TD
></TR
></TABLE
>
</P
><P
>A successful <I
CLASS="FIRSTTERM"
>ping</I
> returns
an <A
HREF="exit-status.html#EXITSTATUSREF"
>exit status</A
> of
<SPAN
CLASS="ERRORCODE"
>0</SPAN
>. This can be tested for in a
script.</P
><P
><A
NAME="PING0"
></A
></P
><P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><FONT
COLOR="#000000"
><PRE
CLASS="PROGRAMLISTING"
> HNAME=news-15.net # Notorious spammer.
# HNAME=$HOST # Debug: test for localhost.
count=2 # Send only two pings.
if [[ `ping -c $count "$HNAME"` ]]
then
echo ""$HNAME" still up and broadcasting spam your way."
else
echo ""$HNAME" seems to be down. Pity."
fi</PRE
></FONT
></TD
></TR
></TABLE
></P
></DD
><DT
><A
NAME="WHOISREF"
></A
><B
CLASS="COMMAND"
>whois</B
></DT
><DD
><P
>Perform a DNS (Domain Name System) lookup.
The <TT
CLASS="OPTION"
>-h</TT
> option permits specifying which
particular <I
CLASS="FIRSTTERM"
>whois</I
> server to query. See
<A
HREF="othertypesv.html#EX18"
>Example 4-6</A
> and <A
HREF="communications.html#SPAMLOOKUP"
>Example 16-40</A
>.</P
></DD
><DT
><A
NAME="FINGERREF"
></A
><B
CLASS="COMMAND"
>finger</B
></DT
><DD
><P
>Retrieve information about users on a
network. Optionally, this command can display
a user's <TT
CLASS="FILENAME"
>~/.plan</TT
>,
<TT
CLASS="FILENAME"
>~/.project</TT
>, and
<TT
CLASS="FILENAME"
>~/.forward</TT
> files, if present.</P
><P
> <TABLE
BORDER="1"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><FONT
COLOR="#000000"
><PRE
CLASS="SCREEN"
><TT
CLASS="PROMPT"
>bash$ </TT
><TT
CLASS="USERINPUT"
><B
>finger</B
></TT
>
<TT
CLASS="COMPUTEROUTPUT"
>Login Name Tty Idle Login Time Office Office Phone
bozo Bozo Bozeman tty1 8 Jun 25 16:59 (:0)
bozo Bozo Bozeman ttyp0 Jun 25 16:59 (:0.0)
bozo Bozo Bozeman ttyp1 Jun 25 17:07 (:0.0)</TT
>
<TT
CLASS="PROMPT"
>bash$ </TT
><TT
CLASS="USERINPUT"
><B
>finger bozo</B
></TT
>
<TT
CLASS="COMPUTEROUTPUT"
>Login: bozo Name: Bozo Bozeman
Directory: /home/bozo Shell: /bin/bash
Office: 2355 Clown St., 543-1234
On since Fri Aug 31 20:13 (MST) on tty1 1 hour 38 minutes idle
On since Fri Aug 31 20:13 (MST) on pts/0 12 seconds idle
On since Fri Aug 31 20:13 (MST) on pts/1
On since Fri Aug 31 20:31 (MST) on pts/2 1 hour 16 minutes idle
Mail last read Tue Jul 3 10:08 2007 (MST)
No Plan.</TT
>
</PRE
></FONT
></TD
></TR
></TABLE
>
</P
><P
>Out of security considerations, many networks disable
<B
CLASS="COMMAND"
>finger</B
> and its associated daemon.
<A
NAME="AEN13320"
HREF="#FTN.AEN13320"
><SPAN
CLASS="footnote"
>[1]</SPAN
></A
>
</P
></DD
><DT
><A
NAME="CHFNREF"
></A
><B
CLASS="COMMAND"
>chfn</B
></DT
><DD
><P
>Change information disclosed by the
<B
CLASS="COMMAND"
>finger</B
> command.</P
></DD
><DT
><A
NAME="VRFYREF"
></A
><B
CLASS="COMMAND"
>vrfy</B
></DT
><DD
><P
>Verify an Internet e-mail address.</P
><P
>This command seems to be missing from newer Linux
distros.</P
></DD
></DL
></DIV
><P
></P
><DIV
CLASS="VARIABLELIST"
><P
><B
><A
NAME="COMMREMOTE1"
></A
>Remote Host Access</B
></P
><DL
><DT
><A
NAME="RXREF"
></A
><B
CLASS="COMMAND"
>sx</B
>, <B
CLASS="COMMAND"
>rx</B
></DT
><DD
><P
>The <B
CLASS="COMMAND"
>sx</B
> and <B
CLASS="COMMAND"
>rx</B
>
command set serves to transfer files to and from a remote
host using the <I
CLASS="FIRSTTERM"
>xmodem</I
> protocol. These
are generally part of a communications package, such as
<B
CLASS="COMMAND"
>minicom</B
>.</P
></DD
><DT
><A
NAME="RZREF"
></A
><B
CLASS="COMMAND"
>sz</B
>, <B
CLASS="COMMAND"
>rz</B
></DT
><DD
><P
>The <B
CLASS="COMMAND"
>sz</B
> and <B
CLASS="COMMAND"
>rz</B
>
command set serves to transfer files to and from a remote
host using the <I
CLASS="FIRSTTERM"
>zmodem</I
> protocol.
<I
CLASS="FIRSTTERM"
>Zmodem</I
> has certain advantages over
<I
CLASS="FIRSTTERM"
>xmodem</I
>, such as faster transmission
rate and resumption of interrupted file transfers.
Like <B
CLASS="COMMAND"
>sx</B
> and <B
CLASS="COMMAND"
>rx</B
>,
these are generally part of a communications package.</P
></DD
><DT
><A
NAME="FTPREF"
></A
><B
CLASS="COMMAND"
>ftp</B
></DT
><DD
><P
>Utility and protocol for uploading / downloading
files to or from a remote host. An ftp session can be automated
in a script (see <A
HREF="here-docs.html#EX72"
>Example 19-6</A
> and <A
HREF="contributed-scripts.html#ENCRYPTEDPW"
>Example A-4</A
>).</P
></DD
><DT
><A
NAME="UUCPREF"
></A
><B
CLASS="COMMAND"
>uucp</B
>, <A
NAME="UUXREF"
></A
><B
CLASS="COMMAND"
>uux</B
>, <A
NAME="CUREF"
></A
><B
CLASS="COMMAND"
>cu</B
></DT
><DD
><P
><B
CLASS="COMMAND"
>uucp</B
>: <I
CLASS="FIRSTTERM"
>UNIX to UNIX
copy</I
>. This is a communications package for
transferring files between UNIX servers. A shell script
is an effective way to handle a <B
CLASS="COMMAND"
>uucp</B
>
command sequence.</P
><P
>Since the advent of the Internet and e-mail,
<B
CLASS="COMMAND"
>uucp</B
> seems to have faded into obscurity,
but it still exists and remains perfectly workable in
situations where an Internet connection is not available
or appropriate. The advantage of <B
CLASS="COMMAND"
>uucp</B
>
is that it is fault-tolerant, so even if there is a service
interruption the copy operation will resume where it left
off when the connection is restored.</P
><P
>---</P
><P
><B
CLASS="COMMAND"
>uux</B
>: <I
CLASS="FIRSTTERM"
>UNIX to UNIX
execute</I
>. Execute a command on a remote system.
This command is part of the <B
CLASS="COMMAND"
>uucp</B
>
package.</P
><P
>---</P
><P
><B
CLASS="COMMAND"
>cu</B
>: <B
CLASS="COMMAND"
>C</B
>all
<B
CLASS="COMMAND"
>U</B
>p a remote system and connect as a
simple terminal. It is a sort of dumbed-down version of
<A
HREF="communications.html#TELNETREF"
>telnet</A
>. This command is
part of the <B
CLASS="COMMAND"
>uucp</B
> package.</P
></DD
><DT
><A
NAME="TELNETREF"
></A
><B
CLASS="COMMAND"
>telnet</B
></DT
><DD
><P
>Utility and protocol for connecting to a remote host.</P
><DIV
CLASS="CAUTION"
><P
></P
><TABLE
CLASS="CAUTION"
WIDTH="90%"
BORDER="0"
><TR
><TD
WIDTH="25"
ALIGN="CENTER"
VALIGN="TOP"
><IMG
SRC="../images/caution.gif"
HSPACE="5"
ALT="Caution"></TD
><TD
ALIGN="LEFT"
VALIGN="TOP"
><P
>The <I
CLASS="FIRSTTERM"
>telnet</I
> protocol
contains security holes and should therefore probably be
avoided. Its use within a shell script is
<EM
>not</EM
> recommended.</P
></TD
></TR
></TABLE
></DIV
></DD
><DT
><A
NAME="WGETREF"
></A
><B
CLASS="COMMAND"
>wget</B
></DT
><DD
><P
>The <B
CLASS="COMMAND"
>wget</B
> utility
<I
CLASS="FIRSTTERM"
>noninteractively</I
> retrieves or
downloads files from a Web or ftp site. It works well in a
script.</P
><P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><FONT
COLOR="#000000"
><PRE
CLASS="PROGRAMLISTING"
>wget -p http://www.xyz23.com/file01.html
# The -p or --page-requisite option causes wget to fetch all files
#+ required to display the specified page.
wget -r ftp://ftp.xyz24.net/~bozo/project_files/ -O $SAVEFILE
# The -r option recursively follows and retrieves all links
#+ on the specified site.
wget -c ftp://ftp.xyz25.net/bozofiles/filename.tar.bz2
# The -c option lets wget resume an interrupted download.
# This works with ftp servers and many HTTP sites.</PRE
></FONT
></TD
></TR
></TABLE
></P
><DIV
CLASS="EXAMPLE"
><A
NAME="QUOTEFETCH"
></A
><P
><B
>Example 16-42. Getting a stock quote</B
></P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><FONT
COLOR="#000000"
><PRE
CLASS="PROGRAMLISTING"
>#!/bin/bash
# quote-fetch.sh: Download a stock quote.
E_NOPARAMS=86
if [ -z "$1" ] # Must specify a stock (symbol) to fetch.
then echo "Usage: `basename $0` stock-symbol"
exit $E_NOPARAMS
fi
stock_symbol=$1
file_suffix=.html
# Fetches an HTML file, so name it appropriately.
URL='http://finance.yahoo.com/q?s='
# Yahoo finance board, with stock query suffix.
# -----------------------------------------------------------
wget -O ${stock_symbol}${file_suffix} "${URL}${stock_symbol}"
# -----------------------------------------------------------
# To look up stuff on http://search.yahoo.com:
# -----------------------------------------------------------
# URL="http://search.yahoo.com/search?fr=ush-news&#38;p=${query}"
# wget -O "$savefilename" "${URL}"
# -----------------------------------------------------------
# Saves a list of relevant URLs.
exit $?
# Exercises:
# ---------
#
# 1) Add a test to ensure the user running the script is on-line.
# (Hint: parse the output of 'ps -ax' for "ppp" or "connect."
#
# 2) Modify this script to fetch the local weather report,
#+ taking the user's zip code as an argument.</PRE
></FONT
></TD
></TR
></TABLE
></DIV
><P
>See also <A
HREF="contributed-scripts.html#WGETTER2"
>Example A-30</A
> and <A
HREF="contributed-scripts.html#BASHPODDER"
>Example A-31</A
>.</P
></DD
><DT
><A
NAME="LYNXREF"
></A
><B
CLASS="COMMAND"
>lynx</B
></DT
><DD
><P
>The <B
CLASS="COMMAND"
>lynx</B
> Web and file browser
can be used inside a script (with the
<TT
CLASS="OPTION"
>-dump</TT
> option) to retrieve a file from a Web or
ftp site noninteractively.</P
><P
> <TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><FONT
COLOR="#000000"
><PRE
CLASS="PROGRAMLISTING"
>lynx -dump http://www.xyz23.com/file01.html &#62;$SAVEFILE</PRE
></FONT
></TD
></TR
></TABLE
>
</P
><P
>With the <TT
CLASS="OPTION"
>-traversal</TT
> option,
<B
CLASS="COMMAND"
>lynx</B
> starts at the HTTP URL specified
as an argument, then <SPAN
CLASS="QUOTE"
>"crawls"</SPAN
> through all
links located on that particular server. Used together
with the <TT
CLASS="OPTION"
>-crawl</TT
> option, outputs page text
to a log file.</P
></DD
><DT
><A
NAME="RLOGINREF"
></A
><B
CLASS="COMMAND"
>rlogin</B
></DT
><DD
><P
><TT
CLASS="REPLACEABLE"
><I
>Remote login</I
></TT
>, initates a
session on a remote host. This command has security issues,
so use <A
HREF="communications.html#SSHREF"
>ssh</A
> instead.</P
></DD
><DT
><A
NAME="RSHREF"
></A
><B
CLASS="COMMAND"
>rsh</B
></DT
><DD
><P
><TT
CLASS="REPLACEABLE"
><I
>Remote shell</I
></TT
>, executes
command(s) on a remote host. This has security issues,
so use <B
CLASS="COMMAND"
>ssh</B
> instead.</P
></DD
><DT
><A
NAME="RCPREF"
></A
><B
CLASS="COMMAND"
>rcp</B
></DT
><DD
><P
><TT
CLASS="REPLACEABLE"
><I
>Remote copy</I
></TT
>, copies files
between two different networked machines.</P
></DD
><DT
><A
NAME="RSYNCREF"
></A
><B
CLASS="COMMAND"
>rsync</B
></DT
><DD
><P
><TT
CLASS="REPLACEABLE"
><I
>Remote synchronize</I
></TT
>, updates
(synchronizes) files
between two different networked machines.</P
><P
> <TABLE
BORDER="1"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><FONT
COLOR="#000000"
><PRE
CLASS="SCREEN"
><TT
CLASS="PROMPT"
>bash$ </TT
><TT
CLASS="USERINPUT"
><B
>rsync -a ~/sourcedir/*txt /node1/subdirectory/</B
></TT
>
</PRE
></FONT
></TD
></TR
></TABLE
>
</P
><DIV
CLASS="EXAMPLE"
><A
NAME="FC4UPD"
></A
><P
><B
>Example 16-43. Updating FC4</B
></P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><FONT
COLOR="#000000"
><PRE
CLASS="PROGRAMLISTING"
>#!/bin/bash
# fc4upd.sh
# Script author: Frank Wang.
# Slight stylistic modifications by ABS Guide author.
# Used in ABS Guide with permission.
# Download Fedora Core 4 update from mirror site using rsync.
# Should also work for newer Fedora Cores -- 5, 6, . . .
# Only download latest package if multiple versions exist,
#+ to save space.
URL=rsync://distro.ibiblio.org/fedora-linux-core/updates/
# URL=rsync://ftp.kddilabs.jp/fedora/core/updates/
# URL=rsync://rsync.planetmirror.com/fedora-linux-core/updates/
DEST=${1:-/var/www/html/fedora/updates/}
LOG=/tmp/repo-update-$(/bin/date +%Y-%m-%d).txt
PID_FILE=/var/run/${0##*/}.pid
E_RETURN=85 # Something unexpected happened.
# General rsync options
# -r: recursive download
# -t: reserve time
# -v: verbose
OPTS="-rtv --delete-excluded --delete-after --partial"
# rsync include pattern
# Leading slash causes absolute path name match.
INCLUDE=(
"/4/i386/kde-i18n-Chinese*"
# ^ ^
# Quoting is necessary to prevent globbing.
)
# rsync exclude pattern
# Temporarily comment out unwanted pkgs using "#" . . .
EXCLUDE=(
/1
/2
/3
/testing
/4/SRPMS
/4/ppc
/4/x86_64
/4/i386/debug
"/4/i386/kde-i18n-*"
"/4/i386/openoffice.org-langpack-*"
"/4/i386/*i586.rpm"
"/4/i386/GFS-*"
"/4/i386/cman-*"
"/4/i386/dlm-*"
"/4/i386/gnbd-*"
"/4/i386/kernel-smp*"
# "/4/i386/kernel-xen*"
# "/4/i386/xen-*"
)
init () {
# Let pipe command return possible rsync error, e.g., stalled network.
set -o pipefail # Newly introduced in Bash, version 3.
TMP=${TMPDIR:-/tmp}/${0##*/}.$$ # Store refined download list.
trap "{
rm -f $TMP 2&#62;/dev/null
}" EXIT # Clear temporary file on exit.
}
check_pid () {
# Check if process exists.
if [ -s "$PID_FILE" ]; then
echo "PID file exists. Checking ..."
PID=$(/bin/egrep -o "^[[:digit:]]+" $PID_FILE)
if /bin/ps --pid $PID &#38;&#62;/dev/null; then
echo "Process $PID found. ${0##*/} seems to be running!"
/usr/bin/logger -t ${0##*/} \
"Process $PID found. ${0##*/} seems to be running!"
exit $E_RETURN
fi
echo "Process $PID not found. Start new process . . ."
fi
}
# Set overall file update range starting from root or $URL,
#+ according to above patterns.
set_range () {
include=
exclude=
for p in "${INCLUDE[@]}"; do
include="$include --include \"$p\""
done
for p in "${EXCLUDE[@]}"; do
exclude="$exclude --exclude \"$p\""
done
}
# Retrieve and refine rsync update list.
get_list () {
echo $$ &#62; $PID_FILE || {
echo "Can't write to pid file $PID_FILE"
exit $E_RETURN
}
echo -n "Retrieving and refining update list . . ."
# Retrieve list -- 'eval' is needed to run rsync as a single command.
# $3 and $4 is the date and time of file creation.
# $5 is the full package name.
previous=
pre_file=
pre_date=0
eval /bin/nice /usr/bin/rsync \
-r $include $exclude $URL | \
egrep '^dr.x|^-r' | \
awk '{print $3, $4, $5}' | \
sort -k3 | \
{ while read line; do
# Get seconds since epoch, to filter out obsolete pkgs.
cur_date=$(date -d "$(echo $line | awk '{print $1, $2}')" +%s)
# echo $cur_date
# Get file name.
cur_file=$(echo $line | awk '{print $3}')
# echo $cur_file
# Get rpm pkg name from file name, if possible.
if [[ $cur_file == *rpm ]]; then
pkg_name=$(echo $cur_file | sed -r -e \
's/(^([^_-]+[_-])+)[[:digit:]]+\..*[_-].*$/\1/')
else
pkg_name=
fi
# echo $pkg_name
if [ -z "$pkg_name" ]; then # If not a rpm file,
echo $cur_file &#62;&#62; $TMP #+ then append to download list.
elif [ "$pkg_name" != "$previous" ]; then # A new pkg found.
echo $pre_file &#62;&#62; $TMP # Output latest file.
previous=$pkg_name # Save current.
pre_date=$cur_date
pre_file=$cur_file
elif [ "$cur_date" -gt "$pre_date" ]; then
# If same pkg, but newer,
pre_date=$cur_date #+ then update latest pointer.
pre_file=$cur_file
fi
done
echo $pre_file &#62;&#62; $TMP # TMP contains ALL
#+ of refined list now.
# echo "subshell=$BASH_SUBSHELL"
} # Bracket required here to let final "echo $pre_file &#62;&#62; $TMP"
# Remained in the same subshell ( 1 ) with the entire loop.
RET=$? # Get return code of the pipe command.
[ "$RET" -ne 0 ] &#38;&#38; {
echo "List retrieving failed with code $RET"
exit $E_RETURN
}
echo "done"; echo
}
# Real rsync download part.
get_file () {
echo "Downloading..."
/bin/nice /usr/bin/rsync \
$OPTS \
--filter "merge,+/ $TMP" \
--exclude '*' \
$URL $DEST \
| /usr/bin/tee $LOG
RET=$?
# --filter merge,+/ is crucial for the intention.
# + modifier means include and / means absolute path.
# Then sorted list in $TMP will contain ascending dir name and
#+ prevent the following --exclude '*' from "shortcutting the circuit."
echo "Done"
rm -f $PID_FILE 2&#62;/dev/null
return $RET
}
# -------
# Main
init
check_pid
set_range
get_list
get_file
RET=$?
# -------
if [ "$RET" -eq 0 ]; then
/usr/bin/logger -t ${0##*/} "Fedora update mirrored successfully."
else
/usr/bin/logger -t ${0##*/} \
"Fedora update mirrored with failure code: $RET"
fi
exit $RET</PRE
></FONT
></TD
></TR
></TABLE
></DIV
><P
>See also <A
HREF="contributed-scripts.html#NIGHTLYBACKUP"
>Example A-32</A
>.</P
><DIV
CLASS="NOTE"
><P
></P
><TABLE
CLASS="NOTE"
WIDTH="90%"
BORDER="0"
><TR
><TD
WIDTH="25"
ALIGN="CENTER"
VALIGN="TOP"
><IMG
SRC="../images/note.gif"
HSPACE="5"
ALT="Note"></TD
><TD
ALIGN="LEFT"
VALIGN="TOP"
><P
>Using <A
HREF="communications.html#RCPREF"
>rcp</A
>, <A
HREF="communications.html#RSYNCREF"
>rsync</A
>, and similar
utilities with security implications in a shell
script may not be advisable. Consider, instead, using
<B
CLASS="COMMAND"
>ssh</B
>, <A
HREF="communications.html#SCPREF"
>scp</A
>,
or an <B
CLASS="COMMAND"
>expect</B
> script.</P
></TD
></TR
></TABLE
></DIV
></DD
><DT
><A
NAME="SSHREF"
></A
><B
CLASS="COMMAND"
>ssh</B
></DT
><DD
><P
><TT
CLASS="REPLACEABLE"
><I
>Secure shell</I
></TT
>, logs onto
a remote host and executes commands there. This
secure replacement for <B
CLASS="COMMAND"
>telnet</B
>,
<B
CLASS="COMMAND"
>rlogin</B
>, <B
CLASS="COMMAND"
>rcp</B
>, and
<B
CLASS="COMMAND"
>rsh</B
> uses identity authentication
and encryption. See its <A
HREF="basic.html#MANREF"
>manpage</A
>
for details.</P
><DIV
CLASS="EXAMPLE"
><A
NAME="REMOTE"
></A
><P
><B
>Example 16-44. Using <I
CLASS="FIRSTTERM"
>ssh</I
></B
></P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><FONT
COLOR="#000000"
><PRE
CLASS="PROGRAMLISTING"
>#!/bin/bash
# remote.bash: Using ssh.
# This example by Michael Zick.
# Used with permission.
# Presumptions:
# ------------
# fd-2 isn't being captured ( '2&#62;/dev/null' ).
# ssh/sshd presumes stderr ('2') will display to user.
#
# sshd is running on your machine.
# For any 'standard' distribution, it probably is,
#+ and without any funky ssh-keygen having been done.
# Try ssh to your machine from the command-line:
#
# $ ssh $HOSTNAME
# Without extra set-up you'll be asked for your password.
# enter password
# when done, $ exit
#
# Did that work? If so, you're ready for more fun.
# Try ssh to your machine as 'root':
#
# $ ssh -l root $HOSTNAME
# When asked for password, enter root's, not yours.
# Last login: Tue Aug 10 20:25:49 2004 from localhost.localdomain
# Enter 'exit' when done.
# The above gives you an interactive shell.
# It is possible for sshd to be set up in a 'single command' mode,
#+ but that is beyond the scope of this example.
# The only thing to note is that the following will work in
#+ 'single command' mode.
# A basic, write stdout (local) command.
ls -l
# Now the same basic command on a remote machine.
# Pass a different 'USERNAME' 'HOSTNAME' if desired:
USER=${USERNAME:-$(whoami)}
HOST=${HOSTNAME:-$(hostname)}
# Now excute the above command-line on the remote host,
#+ with all transmissions encrypted.
ssh -l ${USER} ${HOST} " ls -l "
# The expected result is a listing of your username's home
#+ directory on the remote machine.
# To see any difference, run this script from somewhere
#+ other than your home directory.
# In other words, the Bash command is passed as a quoted line
#+ to the remote shell, which executes it on the remote machine.
# In this case, sshd does ' bash -c "ls -l" ' on your behalf.
# For information on topics such as not having to enter a
#+ password/passphrase for every command-line, see
#+ man ssh
#+ man ssh-keygen
#+ man sshd_config.
exit 0</PRE
></FONT
></TD
></TR
></TABLE
></DIV
><DIV
CLASS="CAUTION"
><P
></P
><TABLE
CLASS="CAUTION"
WIDTH="90%"
BORDER="0"
><TR
><TD
WIDTH="25"
ALIGN="CENTER"
VALIGN="TOP"
><IMG
SRC="../images/caution.gif"
HSPACE="5"
ALT="Caution"></TD
><TD
ALIGN="LEFT"
VALIGN="TOP"
><P
>Within a loop, <B
CLASS="COMMAND"
>ssh</B
> may cause
unexpected behavior. According to a <A
HREF="http://groups-beta.google.com/group/comp.unix.shell/msg/dcb446b5fff7d230"
TARGET="_top"
> Usenet post</A
> in the comp.unix shell archives,
<B
CLASS="COMMAND"
>ssh</B
> inherits the loop's
<TT
CLASS="FILENAME"
>stdin</TT
>. To remedy this, pass
<B
CLASS="COMMAND"
>ssh</B
> either the <TT
CLASS="OPTION"
>-n</TT
>
or <TT
CLASS="OPTION"
>-f</TT
> option.</P
><P
>Thanks, Jason Bechtel, for pointing this out.</P
></TD
></TR
></TABLE
></DIV
></DD
><DT
><A
NAME="SCPREF"
></A
><B
CLASS="COMMAND"
>scp</B
></DT
><DD
><P
><TT
CLASS="REPLACEABLE"
><I
>Secure copy</I
></TT
>, similar in
function to <B
CLASS="COMMAND"
>rcp</B
>, copies files between
two different networked machines, but does so using
authentication, and with a security level similar to
<B
CLASS="COMMAND"
>ssh</B
>.</P
></DD
></DL
></DIV
><P
></P
><DIV
CLASS="VARIABLELIST"
><P
><B
><A
NAME="COMMLOCAL1"
></A
>Local Network</B
></P
><DL
><DT
><A
NAME="WRITEREF"
></A
><B
CLASS="COMMAND"
>write</B
></DT
><DD
><P
>This is a utility for terminal-to-terminal communication.
It allows sending lines from your terminal (console or
<I
CLASS="FIRSTTERM"
>xterm</I
>) to that of another user. The
<A
HREF="system.html#MESGREF"
>mesg</A
> command may, of course,
be used to disable write access to a terminal</P
><P
>Since <B
CLASS="COMMAND"
>write</B
> is interactive, it
would not normally find use in a script.</P
></DD
><DT
><A
NAME="NETCONFIGREF"
></A
><B
CLASS="COMMAND"
>netconfig</B
></DT
><DD
><P
>A command-line utility for configuring a network adapter
(using <I
CLASS="FIRSTTERM"
>DHCP</I
>). This command is native
to Red Hat centric Linux distros.</P
></DD
></DL
></DIV
><P
></P
><DIV
CLASS="VARIABLELIST"
><P
><B
><A
NAME="COMMMAIL1"
></A
>Mail</B
></P
><DL
><DT
><B
CLASS="COMMAND"
>mail</B
></DT
><DD
><P
>Send or read e-mail messages.</P
><P
>This stripped-down command-line mail client
works fine as a command embedded in a script.</P
><DIV
CLASS="EXAMPLE"
><A
NAME="SELFMAILER"
></A
><P
><B
>Example 16-45. A script that mails itself</B
></P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><FONT
COLOR="#000000"
><PRE
CLASS="PROGRAMLISTING"
>#!/bin/sh
# self-mailer.sh: Self-mailing script
adr=${1:-`whoami`} # Default to current user, if not specified.
# Typing 'self-mailer.sh wiseguy@superdupergenius.com'
#+ sends this script to that addressee.
# Just 'self-mailer.sh' (no argument) sends the script
#+ to the person invoking it, for example, bozo@localhost.localdomain.
#
# For more on the ${parameter:-default} construct,
#+ see the "Parameter Substitution" section
#+ of the "Variables Revisited" chapter.
# ============================================================================
cat $0 | mail -s "Script \"`basename $0`\" has mailed itself to you." "$adr"
# ============================================================================
# --------------------------------------------
# Greetings from the self-mailing script.
# A mischievous person has run this script,
#+ which has caused it to mail itself to you.
# Apparently, some people have nothing better
#+ to do with their time.
# --------------------------------------------
echo "At `date`, script \"`basename $0`\" mailed to "$adr"."
exit 0
# Note that the "mailx" command (in "send" mode) may be substituted
#+ for "mail" ... but with somewhat different options.</PRE
></FONT
></TD
></TR
></TABLE
></DIV
></DD
><DT
><A
NAME="MAILTOREF"
></A
><B
CLASS="COMMAND"
>mailto</B
></DT
><DD
><P
>Similar to the <B
CLASS="COMMAND"
>mail</B
> command,
<B
CLASS="COMMAND"
>mailto</B
> sends e-mail messages
from the command-line or in a script. However,
<B
CLASS="COMMAND"
>mailto</B
> also permits sending MIME
(multimedia) messages.</P
></DD
><DT
><A
NAME="MAILSTATSREF"
></A
><B
CLASS="COMMAND"
>mailstats</B
></DT
><DD
><P
>Show <I
CLASS="FIRSTTERM"
>mail statistics</I
>. This command
may be invoked only by <I
CLASS="FIRSTTERM"
>root</I
>.</P
><P
> <TABLE
BORDER="1"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><FONT
COLOR="#000000"
><PRE
CLASS="SCREEN"
><TT
CLASS="PROMPT"
>root# </TT
><TT
CLASS="USERINPUT"
><B
>mailstats</B
></TT
>
<TT
CLASS="COMPUTEROUTPUT"
>Statistics from Tue Jan 1 20:32:08 2008
M msgsfr bytes_from msgsto bytes_to msgsrej msgsdis msgsqur Mailer
4 1682 24118K 0 0K 0 0 0 esmtp
9 212 640K 1894 25131K 0 0 0 local
=====================================================================
T 1894 24758K 1894 25131K 0 0 0
C 414 0</TT
>
</PRE
></FONT
></TD
></TR
></TABLE
>
</P
></DD
><DT
><A
NAME="VACATIONREF"
></A
><B
CLASS="COMMAND"
>vacation</B
></DT
><DD
><P
>This utility automatically replies to e-mails that
the intended recipient is on vacation and temporarily
unavailable. It runs on a network, in conjunction with
<B
CLASS="COMMAND"
>sendmail</B
>, and is not applicable to a
dial-up POPmail account.</P
></DD
></DL
></DIV
></DIV
><H3
CLASS="FOOTNOTES"
>Notes</H3
><TABLE
BORDER="0"
CLASS="FOOTNOTES"
WIDTH="100%"
><TR
><TD
ALIGN="LEFT"
VALIGN="TOP"
WIDTH="5%"
><A
NAME="FTN.AEN13320"
HREF="communications.html#AEN13320"
><SPAN
CLASS="footnote"
>[1]</SPAN
></A
></TD
><TD
ALIGN="LEFT"
VALIGN="TOP"
WIDTH="95%"
><P
><A
NAME="DAEMONREF"
></A
></P
><P
>A <I
CLASS="FIRSTTERM"
>daemon</I
> is a background
process not attached to a terminal session. Daemons
perform designated services either at specified times
or explicitly triggered by certain events.</P
><P
>The word <SPAN
CLASS="QUOTE"
>"daemon"</SPAN
> means ghost in
Greek, and there is certainly something mysterious,
almost supernatural, about the way UNIX daemons
wander about behind the scenes, silently carrying
out their appointed tasks.</P
></TD
></TR
></TABLE
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
SUMMARY="Footer navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="filearchiv.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
ACCESSKEY="H"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="terminalccmds.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>File and Archiving Commands</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="external.html"
ACCESSKEY="U"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Terminal Control Commands</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>