如何配置登录时运行的命令(但仅限通过 telnet 运行)

如何配置登录时运行的命令(但仅限通过 telnet 运行)

我希望每次登录我的 Ubuntu 机器时都运行一个命令,但前提是我通过 telnet 连接,而不是在控制台登录时运行。

答案1

你的 .bashrc(假设是 bash)中的类似这样的内容应该可以很好地工作:

if ( tty | egrep -q '\/pts\/' )
then
   echo "is a pts - remote login"
else
   echo "is not a pts - local login"
fi

您只需将回声替换为您想要运行的任何内容即可。

答案2

telnet?我不建议使用它!以下方法之一应该适用于大多数远程访问方法。(通过 X 客户端、VNC 或类似方式进行远程访问是可以原谅的例外。)

  • 一些telnetd设置环境变量REMOTEHOST或类似变量,你可以检查
  • 如果你正在运行,xinetd你可以telnetd通过env属性改变环境
  • 如果你真的指的是ssh(OpenSSH),那么你可以检查变量SSH_TTYSSH_CONNECTION

Linux 控制台虚拟终端(在启动 X 之前)将具有 tty 名称,/dev/tty1而不是 pty(伪 tty)/dev/pts/(至少在 x86 上)。在 X 中,终端将被分配 pty。

如果这是一个问题的话,检查环境变量通常可能会被用户破坏。

一个更加强大的一般案例解决方案是从 $$ 开始沿着进程树向上走,直到找到您要查找的内容(或找不到),在脚本中使用它bash

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
}

ssh例如通过登录运行时:

$ if checkparents sshd; then echo ssh; fi
ssh
$ if ! checkparents in.telnetd; then echo not telnet; fi
not telnet

取消注释该echo行即可查看其是否正常运行。

答案3

我个人出于其他原因(设置 DISPLAY)将“我是谁”的输出混杂起来。最后一个字段似乎是登录的“来源”

    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

检查 LOGINHOST 的格式以查看它是否是“远程”登录应该很容易。telnet 在这里被禁用(应该是),所以我无法明确检查它是如何为 telnet 设置的

相关内容