[comp.unix.questions] Summary: passing variables to rlogin

umh@vax5.cit.cornell.edu (04/19/91)

A few days ago I posted a question essentially asking how I could pass
variables to rlogin, within the context of being able to
rlogin to a remote machine and have my DISPLAY variable automatically follow
me. A number of people replied to me about this. Many
thanks to those who helped me. There were also many extremely rude replies
telling me to look at the X Frequently Answered Questions
or to read the manual, all of whose authors completetly missed my point.

The issue I was trying to address was NOT Rhow do I create an xterm logged into
another machine but displaying on my machine?S, or
Rhow do I use rsh to run an X program on a remote machine and have itUs display
automatically sent to the machine IUm sitting at?S
My question was very much withing the context of rlogin- what I wanted was to
able to, from an extant xterm window, rlogin to
another machine, perform various work there- editing, compiling, etc, and
ocasionally test my X binary by running it on the remote
machine and having its display automatically routed to the machine from which I
rlogged in. I do NOT want extra xterm windows
popping up in this process. If you *do* want new windows appearing when yo
login to different machines, then the xrsh script in the
X FAQ is probably of more use to you than what I have to say.

The answer to what I want to do, suggested by two people, is to utilize the
fact that the term variable is sent to the remote rlogin
process, hence one encodes whatever information one wishes to use in the term
variable and parses term in oneUs .login script. This
works very well, the one gotcha being that the .login on EVERY machine you
rlogin to must have this parsing put into it, otherwise
it will complain about the term variable it is being sent.

So the idea is to put in oneUs .login something like below: 

if ( $TERM == "dialup" || $TERM == "sytek" ) then
        # setup vt100 characteristics for dialup
        set term = vt100
else if ( $term =~ *@* ) then
        #setup DISPLAY variable
        setenv DISPLAY `echo $term | sed 's/.*@//' | sed 's/:.*//'`:0
        set term = `echo $term | sed 's/@.*//'`
else
        #unencoded term variable sent.
        set term = $TERM
endif

I donUt know what the difference between term and TERM at rlogin time is, so
some of these operations may be redundant, but the
above does work for both network and dialup access on our machines.

To encode term, one uses a script which I call r, something like below:

#!/bin/csh -f
if ( $#argv != 1) then
        echo usage: r hostname
        exit (1)
endif

xhost + >& /dev/null
if ( $DISPLAY == unix:0.0 ) then
        set term = ${TERM}@`hostname`
else
        set term = ${TERM}@${DISPLAY}
endif
rlogin $1


This is not completely general- eg it does not handle the -l option of rlogin,
but I never use that so I couldnUt be bothered to
include it. Changing the above to be more general is obviously easy- replace
the $1 with $* and throw out the error check (or devote
lots of energy to getting it right.)

There are other possible solutions. Some people proposed kludges with files,
relying on NFS to have these seen by the remote
machine. I was using something like that, but it becomes very ugly when you
often login from one NFS network to another. Also that
scheme dies when you login from a, then to b, the from b to c, or if you login
to the consoles of two machines simultaneously.

Other people pointed out that when one runs who, one of the fields is the
network address of oneUs login connection, so that in
.login, one can run who, scan for oneUs name, and parse this connection field
with sed. This suffers from the fact that the
connection field is truncated at 15 characters, so one has to put some smarts
in the script to extrapolate beyond there, or to
truncate at a sensible place, but may be useful under some circumstances.

I was told that on Suns there is a program called last which provides a history
of oneUs logins, and so could be utilized in the
place of the above with who, and which would probably be more elegant.

Hope this helps.

Maynard Handley