Quero ver se estou conectado via ssh ou executando um terminal local.
Se eu apenas ssh em um servidor sem alterar para root via sudo
, é fácil. Qualquer uma das variáveis $SSH_CLIENT
, $SSH_CONNECTION
ou $SSH_TTY
pode ser usada para verificar se uma está conectada via SSH ou local.
Problema: Quando eu elevo para a conta root sudo -i
para fazer coisas administrativas, nenhuma dessas variáveis é útil - elas estão todas vazias.
Qual é a melhor maneira de descobrir se a conexão é local ou via SSH?
EDIT: Com a resposta aceita, é fácil ter um prompt bash discreto que reflete o status e os privilégios do ssh:
if [ "$color_prompt" = yes ]; then
# when system is accessed via SSH, hostname with light grey background
if [[ $(pstree -s $$) = *sshd* ]]; then sshbg="\[\033[48;5;7m\]"; fi
# when used as root, change username to orange and '#' to red for prompt
if [ $(id -u) -eq 0 ]; then usercol="\[\033[38;5;3m\]"; hashcol="\[\033[38;5;1m\]"; else usercol="\[\033[38;5;2m\]"; fi
# bash PS1 prompt
PS1="${usercol}\u\[$(tput sgr0)\]@\[$(tput sgr0)\]\[\033[38;5;4m\]${sshbg}\h\[$(tput sgr0)\]:\[$(tput sgr0)\]\[\033[38;5;6m\]\w\[$(tput sgr0)\]${hashcol}\\$ \[$(tput sgr0)\]"
unset sshbg rootcol hashcol
fi
A versão temporizada da pstree
peça é executada em menos de 20ms, para que possa ser usada sem introduzir atrasos perceptíveis.
Se você estiver em um shell bash, você pode fazer
pstree -s $$
($$ é o PID do shell atual) e procurar por "sshd" na saída.Você também pode usar:
Se diz pts/0, pts/1 etc. você está em SSH, se diz tty1, tty2 etc. você está em uma conexão local.
Quando me conecto usando SSH, recebo o seguinte
who am i
:Talvez o endereço IP também possa ser usado como um indicador para diferenciar uma conexão SSH de uma conexão local na área de trabalho.
Também explicado aqui: Como verificar qual tty estou usando atualmente? .