SHELLdorado Newsletter 2/1999 - September 5, 1999
================================================================
The "SHELLdorado Newsletter" covers UNIX shell script related
topics. To subscribe to this newsletter, leave your e-mail
address at the SHELLdorado homepage:
http://www.shelldorado.com/
"Heiner's SHELLdorado" is a place for UNIX shell script
programmers providing
Many shell script examples,
shell scripting tips & tricks + more...
================================================================
Contents
o What's new at the SHELLdorado?
o Shell Tip: Korn shell build-in networking functions
o Shell Tip: How to execute a script for each logout
o Q&A: How to write a HTTP server using shell scripts
-----------------------------------------------------------------
>> What's new at the SHELLdorado?
-----------------------------------------------------------------
o New Article "Sending files as mail attachments"
With newer mail clients (like Netscape's "Messenger") it's
very easy to attach a file (i.e. a JPEG-image) to a mail.
This feature would be very useful for shell scripts, too.
Some examples:
- automatically send a ".tar.gz"-file for backup purposes
to another file server
- automatically send multiple log files to the system
administrator (i.e. periodically using a "cron" job),
with each file being a mail attachment
- or just send the newest scanned-in holiday photos to
a friend
The following article explains different ways how to send
files as mail attachments, and gives practical examples:
http://www.shelldorado.com/articles/mailattachments.html
-----------------------------------------------------------------
>> Shell Tip: Korn shell build-in networking functions
-----------------------------------------------------------------
[ Further shell scripting tips & tricks: ]
[ http://www.shelldorado.com/shelltips/ ]
Note: the following examples will work only with standard
ksh implementations. They will not work with the Linux Korn
shell "pdksh".
Most Korn Shells (/bin/ksh) have sparsely documented, build-in
networking functions.
Example:
$ date=
$ read date < /dev/tcp/127.0.0.1/13
$ echo $date
Sun Sep 5 14:16:25 MEST 1999
This command opens a TCP connection to the IP address 127.0.0.1
(the local loopback IP address), and connects to the port "13"
(daytime, see /etc/services). The current date and time is
returned, and assigned to the variable "date".
Note that the "/dev/tcp/*" directories do not have to exist;
the file names are special to the Korn Shell and are interpreted
by the shell internally. Only numerical ip addresses and port
numbers are supported; "read date < /dev/tcp/localhost/daytime"
does not work.
-----------------------------------------------------------------
>> Shell Tip: How to execute a script for each logout
-----------------------------------------------------------------
Sometimes it's useful to execute a command after each
logout, i.e. to cleanup temporary directories, or to log
working hours.
This is the way to make the shell execute the script
$HOME/.logout after each logout:
1. Insert this line at the beginning of the file
$HOME/.profile:
trap ". $HOME/.logout" 0
2. Create a file named "$HOME/.logout", that may contain
arbitrary shell commands, i.e.
$ cat > $HOME/.logout
echo "Good bye $LOGNAME, the time is `date`"
^D
That's it! After the next login, the shell will execute
the contents of the file "$HOME/.logout".
NOTE: this will not work for C-Shell dialects, i.e. TCSH
-----------------------------------------------------------------
>> Q&A: How to write a HTTP server using shell scripts
-----------------------------------------------------------------
If you want to use a WWW browser like Netscape or Lynx on
your local UNIX system for local files, you don't need a
large HTTP server like "Apache". Sometimes the following
small Korn shell script is sufficient to test local HTML
pages!
The following script "httpd.ksh" implements a
rudimentary HTTP-Server (the code is available at
http://www.shelldorado.com/scripts/cmds/example/httpd.ksh )
You can test the server by first starting it ("./httpd.ksh"),
and directing the browser to the following URL to display
the file ".profile" from your HOME directory:
http://127.0.0.1:8080/.profile
[Note: this script uses the non-standard "netcat"
program available with most Linux systems, or at
ftp://zippy.telcom.arizona.edu//pub/mirrors/avian.org/hacks/nc110.tgz]
#! /bin/ksh
# http.ksh - minimal HTTP-Server (heiner.steven@odn.de)
PORT=8080 # TCP port to listen to (standard is 80)
ROOT=$HOME # Document root. All paths are relative to this
echo >&2 "listening to port $PORT, documentroot is $ROOT"
while :
do
# Start "netcat" in listen mode as server. On some systems
# the command has# the name "nc".
netcat -l -p $PORT |&
exec 3<&p 4>&p # redirect co-process' input to fd 3 and 4
# Read HTTP request header
requestline=
while read -u3 line
do
# An empty line marks end of request header
[[ $line = ?(\r) ]] && break
[[ -z $requestline ]] && requestline=$line
done
# Example request line:
# GET /document.txt HTTP/1.0
echo >&2 "< REQUEST: $requestline"
set -- $requestline
reqtype=$1
# Create HTTP response header
file=$ROOT/$2
[[ -d "$file" ]] && file="$file/index.html"
if [[ $reqtype = GET && -r $file && -f $file ]]
then
print -u4 "HTTP/1.0 200 OK\r"
print -u4 Content-Length: `wc -c < $file`"\r"
print -u4 "\r"
cat "$file" >&4
else
print -u4 "HTTP/1.0 404 Not Found\r"
print -u4 "\r"
fi
# Close file descriptors of co-process.
# This should terminate it:
exec 3>&- 4>&-
# "netcat" waits for the other party to close the
# connection, but the browser will not do this:
kill -1 $! >/dev/null 2>&1
done
Of course this server is very crude, but it works
surprisingly well for the most common cases.
Instead of listing the things the server cannot do
(there are many), here is the definite reference for
the things it should have been able to do: RFC 1945
(http://www.ietf.org/rfc/rfc1945.txt).
----------------------------------------------------------------
If you want to comment on the newsletter, or even want to submit
an article of your own, send a mail to
mailto:heiner.steven@shelldorado.com
================================================================
To unsubscribe send a mail with the body "unsubscribe" to
newsletter@shelldorado.com
================================================================