2
I want to run a command every time I log in to my Ubuntu box, but only if I'm connecting through telnet, not if I'm logging in at the console.
2
I want to run a command every time I log in to my Ubuntu box, but only if I'm connecting through telnet, not if I'm logging in at the console.
2
Something like this in your .bashrc (assuming bash) should work fairly well:
if ( tty | egrep -q '\/pts\/' )
then
echo "is a pts - remote login"
else
echo "is not a pts - local login"
fi
You would just replace the echo's with whatever it was that you wanted to run.
0
telnet? I don't recommend its use! One of the following approaches should work for most methods of remote access. (Remote access via a X client, or via VNC or similar being excusable exceptions.)
telnetd set the environment variable REMOTEHOST or similar which you can checkxinetd you can alter the telnetd environment via the env attribute ssh (OpenSSH), then you can check either of the variables SSH_TTY and SSH_CONNECTION.The Linux console virtual terminals (before you start X) will have tty names like /dev/tty1 rather than pty (pseudo-ttys) in /dev/pts/ (at least on x86). Within X, terminals will be allocated ptys.
Checking environment variables can often be subverted by users, if that's a concern.
A more robust general case solution is to walk up the process tree from $$, until you find what you're looking for (or not), use this in a bash script:
function checkparents()
{
local _proc=$1 _pid _ppid=$$ _tty="" _comm _rc=1
while [ "$_ppid" != "1" ]; do
read _pid _ppid _tty _comm < <(ps --no-headers -p $_ppid -o "pid ppid tty comm")
#echo "$_pid $_ppid $_tty $_comm"
[ "$_comm" = "$_proc" ] && { _rc=0; break; }
[ "$_pid" = "$_proc" ] && { _rc=0; break; }
done
return $_rc
}
When run via an ssh login for example:
$ if checkparents sshd; then echo ssh; fi
ssh
$ if ! checkparents in.telnetd; then echo not telnet; fi
not telnet
Un-comment the echo line to see it working.
0
I personally munge the output of "who am i" for other reasons (setting DISPLAY). The last field seems to be the "source" of the login
typeset -a LOGINARRAY
# who am I format: USER TTY MON DAY TIME LOGINHOST,
# use array to get last entry
LOGINARRAY=( $(/usr/bin/who -sum) )
LASTINDEX=$(( ${#LOGINARRAY[*]} - 1))
LOGINHOST=${LOGINARRAY[$LASTINDEX]}
LOGINHOST=${LOGINHOST##*\(}
LOGINHOST=${LOGINHOST%%)*}
DISPLAY=$LOGINHOST:0
export DISPLAY
unset LOGINARRAY LASTINDEX
it should be easy enough to check the format of LOGINHOST to see if it's a "remote" login. telnet is disabled here (as it should be) so I can't explicitly check to see how it's set for telnet
A pty will also be allocated for a X terminal or 'screen' window, so this is not very reliable. – user1686 – 2010-02-09T18:40:26.820
I do open a few terminal windows open when I login at the console... – moswald – 2010-02-09T19:11:22.840
Yeah, this is not going to be good enough. That causes all X terminal windows to print 'is a pts - remote login'. – moswald – 2010-02-11T16:41:58.027