Hey(1) [from Unix/World, Oct. 85]
sources-request at panda.UUCP
sources-request at panda.UUCP
Sat Sep 7 00:44:46 AEST 1985
Mod.sources: Volume 3, Issue 10
Submitted by: Bob Desinger <decvax!ucbvax!hpda!bd>
The hey(1) program, published in the October 1985 Unix/World's magazine's
Wizard Grabbag column, attempts to contact a particular person by writing to
all terminals that s/he is using. To save the net some typing, here's a
(slightly improved) machine-readable copy.
The version packed as "hey" in this bundle is a superset of the one published
in the magazine. The new one handles a -n option to look you up all over the
(4.2BSD-style) network. The published magazine version looks only on the local
system, and is packed here as "hey.local". The enclosed man page documents the
networked version.
I haven't seen the issue yet, but I received mail asking for the networked copy
so I guess it's been published. I recently updated the man page with better
English, so this copy is more up-to-date. I don't know if there have been any
bugs introduced by the publishing process (copy is frequently mangled in its
travel from the submittal to the final page), so trust this version.
-- Bob Desinger ucbvax!hpda!bd hpda!bd at BERKELEY
PS: I'm hoping to start a trend here. If you send sources to a magazine,
please send duplicates to mod.sources when they're published (if the
magazine's editors don't mind).
# This is a shell archive. Remove anything before this line,
# then unpack it by saving it in a file and typing "sh file".
#
# Wrapped by hpda!bd on Thu Sep 5 17:37:58 PDT 1985
# Contents: hey.1 hey hey.local
echo x - hey.1
sed 's/^@//' > "hey.1" <<'@//E*O*F hey.1//'
@.TH HEY LOCAL Public-Domain
@.ad b
@.SH NAME
hey \- write to all terminals that a person is using
@.SH SYNOPSIS
\fBhey\fR [\fB-n\fR] person message
@.SH DESCRIPTION
@.I Hey
writes a
@.I message
to all terminals being used by the login
@.IR person .
The
@.I message
is broadcast via
@.IR write (1),
which prints an initial banner identifying the sender.
If the
@.I person
isn't logged in, the
@.I message
is mailed.
@.PP
The
@.B \-n
option causes
@.I hey
to track the person down across the local network.
By default,
@.I hey
looks for the
@.IR person 's
logins only on the local system.
@.PP
Permission to write to a terminal is granted or denied by the
@.IR mesg (1)
command.
@.SH EXAMPLES
Assuming your own login is
@.B me
and the other person's login is
@.BR you :
@.sp
@.RS
(incredibly-long-running-command; hey me all done) &
@.br
hey you Call your wife at home, she just called.
@.br
hey root the console is out of paper
@.RE
@.PP
Note that multi-line messages can be sent via newlines within quotes (from
@.IR /bin/sh )
as in:
@.sp
@.RS
@.nf
hey you 'This
is spread
across
a few lines.'
@.fi
@.sp
@.RE
The same effect is possible from
@.I csh
by typing a backslash (escaped newline) at the end of the message lines.
@.SH DIAGNOSTICS
\fIYou have write permission turned off\fR as printed by
@.IR write (1).
@.SH "SEE ALSO"
mesg(1),
talk(1),
wall(1),
write(1)
@.SH BUGS
Denying write-access via
@.I mesg
works only with local messages.
The
@.B \-n
option handcrafts a faked
@.I write
via
@.IR rsh (1)
and
@.IR cat (1),
which seems to be able to break through steel.
@.PP
This command makes it easy for some people to be obnoxious.
@//E*O*F hey.1//
chmod u=rw,g=r,o=r hey.1
echo x - hey
sed 's/^@//' > "hey" <<'@//E*O*F hey//'
: Broadcast a message to all ttys that a person is logged into.
# System-dependent commands (customize for your installation):
GETHOST='hostname' # some systems use 'uuname -l'
MAILER='Mail' # some systems use 'mailx'
WHOIAM='$USER' # some systems use '$LOGNAME'
cmd=`basename $0` # makes diagnostics under csh look better
USAGE="Usage: $cmd [-n] login Your message here"
# Are we local-only or networked?
case "$1" in
-n) networked=TRUE; shift;;
-*) echo 1>&2 "$USAGE"; exit 1;; # trap bad options
esac
# If we have enough args, find out who to talk at.
if [ $# -lt 2 ]
then echo 1>&2 "$USAGE"; exit 1
else you=$1; shift
fi
# Send the message to each terminal the specified person is logged into.
# If the person isn't logged in anywhere, mail the message to them.
if [ -z "$networked" ]
then # not networked (local delivery only) -- speedy version
ttys=`who | sed -n '/^'$you' /s/^'$you' *\(tty[^ ]*\) .*/\1/p'`
if [ -z "$ttys" ]
then # not logged in
echo 1>&2 "$cmd: $you not logged in;" \
"sending your message via mail."
echo "$@" | $MAILER -s "Hey, $you!" $you
else # logged in one or more times
for tty in $ttys
do
echo "Hey, $you: $@" | write $you $tty
done
fi
else # networked
me=`eval echo $WHOIAM`
myhost=`$GETHOST`
mytty="on `basename \`tty\``"
if [ "$mytty" = "on not" ] # "not a tty" from LAN or crontab
then mytty="in hyperspace"
fi
today=`date`
rwho -a |
sed -n '/^'$you' /s/^'$you' *\([^: ]*\):\(tty[^ ]*\) .*/\1 \2/p' |
while read system tty
do
cat >>/tmp/hey$$ <<@@@
rsh $system -n 'cat >/dev/$tty <<\!
Message from $myhost!$me $mytty at $today ...
Hey, $you: $@
EOF
!
'
@@@@
done
if [ -s /tmp/hey$$ ] # logged in anywhere?
then sh /tmp/hey$$ # yup
else echo 1>&2 "$cmd: $you not logged in;" \
"sending your message via mail."
echo "$@" | $MAILER -s "Hey, $you!" $you
fi
rm -f /tmp/hey$$
fi
@//E*O*F hey//
chmod u=rwx,g=rx,o=rx hey
echo x - hey.local
sed 's/^@//' > "hey.local" <<'@//E*O*F hey.local//'
: Broadcast a message to all ttys that a person is logged into.
# System-dependent command (customize for your installation):
MAILER='Mail' # some systems use 'mailx'
cmd=`basename $0` # makes diagnostics under csh look better
USAGE="Usage: $cmd login Your message here"
# If we have enough args, find out who to talk at.
if [ $# -lt 2 ]
then echo 1>&2 "$USAGE"; exit 1
else you=$1; shift
fi
# Send the message to each terminal the specified person is logged into.
# If the person isn't logged in anywhere, mail the message to them.
# This version is non-networked (for local delivery only).
ttys=`who | sed -n '/^'$you' /s/^'$you' *\(tty[^ ]*\) .*/\1/p'`
if [ -z "$ttys" ]
then # not logged in
echo 1>&2 "$cmd: $you not logged in;" \
"sending your message via mail."
echo "$@" | $MAILER -s "Hey, $you!" $you
else # logged in one or more times
for tty in $ttys
do
echo "Hey, $you: $@" | write $you $tty
done
fi
@//E*O*F hey.local//
chmod u=rwx,g=rx,o=rx hey.local
echo Inspecting for damage in transit...
temp=/tmp/shar$$; dtemp=/tmp/.shar$$
trap "rm -f $temp $dtemp; exit" 0 1 2 3 15
cat > $temp <<\!!!
90 295 1591 hey.1
69 323 1868 hey
30 167 930 hey.local
189 785 4389 total
!!!
wc hey.1 hey hey.local | sed 's=[^ ]*/==' | diff -b $temp - >$dtemp
if [ -s $dtemp ]
then echo "Ouch [diff of wc output]:" ; cat $dtemp
else echo "No problems found."
fi
exit 0
More information about the Mod.sources
mailing list