| Previous | Table of Contents | Next |
These sections contain some examples of Bourne shell scripts.
A script named fez performs an anonymous ftpget or list.
#!/bin/sh
#
# @(#)fez,v1.Ø (me@anywhere.EBay.Sun.COM) 08/29/92
#
PATHNAME=anywhere.EBay:/home/me/bin/fez
MYNAME=`basename $0`
#
# Author:
# Wayne Thompson
#
# Synopsis:
usage=`/bin/sed -e "s/^ *//" << endusage
usage: $MYNAME [-h] [-abfglmprR] [[login@]hostname:[sourcepath]]
endusage`
#
# Description:
# This script will perform an anonymous ftp get or list.
#
# If the hostname is not specified on the command line, then
# it is derived from the basename(1) of the current directory.
# This provides for a hierarchy of hostnames within which to
# get files or directory listings.
#
# If no flags and arguments are given or a single argument of
# the form "hostname:" is given, the default actionwill be
# to retrieve a recursive directory listing from the remote
# host into the file "./ls-lR.".
#
# Directory listings are named in the following manner:
# <the command used to produce the listing w/spacescollapsed>
# followed by the path it was produced from with slashes(/)
# transliterated to dots(.). e.g.
# ls-l. (ls -l /)
# ls-lR.a.b (ls -lR /a/b)
#
# When mirroring is enabled (default), the directory listing
# "ls-lR.a.b" would be placed in the directory"./a/b" which
# would be created if necessary.
# Likewise, "fez export.lcs.mit.edu:/contrib/3dlife.c"would
# get "/contrib/3dlife.c" from"export.lcs.mit.edu" and place
# it into "./contrib/3dlife.c".
# An alternative behavior is provided by the "-f" flag,which
# serves to flatten the destination hierarchy.
# "fez -f export.lcs.mit.edu:/contrib/3dlife.c" wouldget
# "/contrib/3dlife.c" into "./3dlife.c"
#
# The default user is "anonymous".
# The default password is one of:
# internal to Sun = $USER@hostname
# external to Sun = $USER@Sun.Com
# You may override these in $HOME/.netrc (see netrc(5))
# or from the command line.
#
# Options:
# -a ascii mode
# -b binary mode (default)
# -f flatten hierarchy
# -g get (default w/arg)
# -h print command description.
# -l list (default w/o arg)
# -m mirror hierarchy (default)
# -p passwd password
# -(r|R) recursive (default w/o arg)
#
# Environment:
#
# Files:
# $HOME/.netrc file for ftp remote login data
#
# Diagnostics:
# Exit Status:
# Ø normal termination
# 1 abnormal termination
#
# Errors (stderr):
# usage
#
# Warnings (stderr):
#
# Info (stdout):
#
# Dependencies:
# Fez only knows how to talk to UNIX(R) hosts.
#
# Caveats:
# A recursive directory get will not fetch subdirectories unless
# they already exist.
#
# Bugs:
#
# >> BEGIN parse options>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> #
while [ $# -gt Ø ]
do
case $1 in
-??*) # bundled options
opts=$1
while [ $opts ]
do
opts=`/bin/expr $opts : '.\(.*\)'`
case $opts in
a*) # ascii mode
mode=asci
;;
b*) # binary mode
mode=binary
;;
f*) # flatten remote hierarchy
flat=true
;;
g*) # get
;;
l*) # list
list=true
;;
p)
passflg=true
shift
if [ $# -eq Ø ]
then
echo >&2 "$MYNAME: error: nopasswd"
echo >&2 "usage"
exit 1
fi
passwd=$1
;;
p*)
echo >&2 "$MYNAME: error: p:must be last elemenT
of bundled options"
exit 1
;;
[rR]*) # recursive
recurse=true
;;
?*)
echo >&2 "$MYNAME: error:-`/bin/expr $opts :
'\(.\)'`: unknown option."
echo >&2 "$usage"
exit 1
;;
esac
done
shift
;;
-a) # ascii mode
mode=ascii
shift
;;
-b) # binary mode
mode=binary
shift
;;
-f) # flatten remote hierarchy
flat=true
shift
;;
-g) # get
shift
;;
-h) # help
/bin/awk '
/^$/ {
exit;
}
/^[# :]/ && NR > 1 {
print substr ($Ø, 3);
}
' $Ø |
/bin/sed "
/^$/{
N
/^\n$/D
}
s/\$MYNAME/$MYNAME/
quot;
exit Ø
;;
-l) # list
list=true
shift
;;
-m) # mirror remote hierarchy
mirror=true
shift
;;
-p)
passflg=true
shift
if [ $# -eq Ø ]
then
echo >&2 "$MYNAME: error: nopasswd"
echo >&2 "usage"
exit 1
fi
passwd=$1
shift
;;
-[rR]) # recursive
recurse=true
shift
;;
--) # end of options
shift
break
;;
-*)
echo >&2 "$MYNAME: error: $1: unknownoption."
echo >&2 "$usage"
exit 1
;;
*) # end of options
break
;;
esac
done
# << END parse options<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< #
# >> BEGIN parse arguments>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> #
case $# in
Ø)
list=true
recurse=true
;;
1)
case $1 in
*:)
list=true
recurse=true
;;
esac
;;
*)
echo >&2 "$MYNAME: error: unexpectedargument(s)."
echo >&2 "$usage"
exit 1
;;
esac
# << END parse arguments<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< #
# >> BEGIN initialization>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> #
[ umask -ge 700 ] && umask `/bin/expr \`umask\` -0700`
# return unrooted dirname
dirname () {
expr \
'./'${1-.}'/' : '\(\.\)/[^/]*/$' \
\| ${1-.}'/' : '/*\(.*[^/]\)//*[^/][^/]*//*$' \
\| .
}
[ ${1-.} = / ] && set .
host=`/bin/expr#92;
"$1" : '[^@]*@\(.*\):' \
\| "$1" : '\(.*\):' \
\| \`/bin/basename\\\`pwd\\\`\`
`
path=`/bin/expr "$1" : '[^:]*:\(.*\)' \| $1.: '[^:]*:\(.*\)' \| ${1-.}`
dir=`dirname $path`
file=`/bin/basename $path`
login=`/bin/expr "$1" : '\([^@]*\)@' \|anonymous`
if /bin/ypmatch $host hosts.byname 2>&- 1>&- ||
/bin/ypmatch $host hosts.byaddr 2>&- 1>&-
then
port=21
passwd=${passwd-USER@`hostname`}
else
port=4666
passwd=${passwd-USER@Sun.COM}
machine=$host
host=sun-barr.EBay
fi
if [ $list ]
then
cmd="ls -l${recurse+R}"
file=ls-l${recurse+R}`expr \
$path : '\(\.\)$' \
\| $dir$file : '\(\..*\)' \
\| /$dir/$file | tr / .
`
dir=$path
else
cmd=${recurse+m}get
[ $recurse ] && dir=$path && file=\*
fi
case $1 in
*@*:*)
;;
*)
[ $passflg ] ||
eval `
/bin/awk '
/machine *'"${machine-$host}"'/ {
for (i = 1; i <= NF; i++) {
if ($i == "login") print"login="$++i";";
if ($i == "password") print"passwd="$++i";";
}
exit;
}
' $HOME/.netrc 2>&-
`
;;
esac
# << END initialization<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< #
# >> BEGIN verify prerequisites>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> #
if [ ! "$flat" ]
then
/bin/mkdir -p $dir 2>&-
cd $dir
fi
# << END verify prerequisites<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< #
# >> BEGIN main>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> #
/usr/ucb/ftp -i -n -v $host $port << EOFTP
user $login${machine+@$machine} $passwd
${mode-binary}
cd $dir
$cmd $file
quit
EOFTP
echo ""
# << END main<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< #
| Previous | Table of Contents | Next |