我希望每次登录我的 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_TTY
和SSH_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 设置的