Encontre o endereço IP do cliente em uma sessão SSH

166

Eu tenho um script que deve ser executado por uma pessoa que efetua login no servidor com SSH .

Existe uma maneira de descobrir automaticamente de que endereço IP o usuário está se conectando?

Claro, eu poderia perguntar ao usuário (é uma ferramenta para programadores, então não há problema com isso), mas seria mais legal se eu descobrisse.

flybywire
fonte
5
proponho a mudança para serverfault, ainda é uma ótima pergunta embora
BozoJoe

Respostas:

267

Verifique se há uma variável de ambiente chamada:

$SSH_CLIENT 

OU

$SSH_CONNECTION

(ou qualquer outra variável de ambiente) definida quando o usuário efetua login. Em seguida, processe-o usando o script de login do usuário.

Extraia o IP:

$ echo $SSH_CLIENT | awk '{ print $1}'
1.2.3.4
$ echo $SSH_CONNECTION | awk '{print $1}'
1.2.3.4
nolim1t
fonte
@cwd eu quero substituir o ip neste comando "iptables -A INPUT -s 93.203.118.251 -p tcp --destination-port 443 -j DROP" é possível?
Wutzebaer
2
Este foi o REMOTEHOST para mim.
7486 dramzy
5
funciona apenas com usuários não sudoed. por exemplo, se você tiver um usuário ssh e depois escalar para raiz, um novo shell será criado e essas variáveis ​​serão perdidas, a menos que você possa rastrear a árvore para encontrar o ssh pid original e obter as variáveis ​​em / proc / $ PID / environ
Andrej
5
graças a stackoverflow.com/questions/428109/extract-substring-in-bash, esta resposta pode ser aprimorada de maneira simples${SSH_CLIENT%% *}
Jeff Jeff
@Andrej investigarsudo -E
Jeff
105

Você pode usar o comando:

server:~# pinky

que lhe dará algo assim:

Login      Name                 TTY    Idle   When                 Where 

root       root                 pts/0         2009-06-15 13:41     192.168.1.133
vncprado
fonte
13
Isso é incrível :-) O humor dos nerds aumentou mais uma vez. De acordo com pinky --help:A lightweight 'finger' program; print user information. The utmp file will be /var/run/utmp.
Chris Woods
Por que o meu 'Onde' na minha saída mostra apenas o nome da máquina e não o endereço IP?
Isaganiesteron
Provavelmente você tem o servidor de nomes configurado em sua máquina.
precisa saber é o seguinte
mindinho irá mostrar todos os usuários logados, e não apenas a si mesmo
Andrej
33

Tente o seguinte para obter apenas o endereço IP:

who am i|awk '{ print $5}'
AlexP
fonte
com certeza se você escrever whoami e obterá o nome do usuário conectado. não há quinta coisa ou ip para imprimir desculpe. mas whoami é um comando útil
gerard
15
who am i! = whoamipelo menos no meu Linux. Há uma quinta coisa e é o nome do host do cliente.
precisa saber é o seguinte
5
Para qualquer outra pessoa perguntando sobre who am i: A página de manual para whodiz: If ARG1 ARG2 given, -m presumed: 'am i' or 'mom likes' are usual.. Então, realmente qualquer coisa com duas palavras funciona, também coisas como who likes icecream.
jmiserez
3
Com base nesta resposta, reduzi-a who -m --ips|awk '{print $5}'para ter apenas IP e nenhuma resposta de DNS reverso. Obrigado pela ajuda who am i!
Yvan
1
Falha com tmux: who am i|awk '{ print $5}' (tmux(2445).%3)
Alexx Roche
19

Basta digitar o seguinte comando na sua máquina Linux:

who
Bangar
fonte
6
 who | cut -d"(" -f2 |cut -d")" -f1
danilo
fonte
5
who am i | awk '{print $5}' | sed 's/[()]//g' | cut -f1 -d "." | sed 's/-/./g'


export DISPLAY=`who am i | awk '{print $5}' | sed 's/[()]//g' | cut -f1 -d "." | sed 's/-/./g'`:0.0

Eu uso isso para determinar minha variável DISPLAY para a sessão ao efetuar login via ssh e preciso exibir o X remoto.

Spindrift
fonte
Útil liner para adicionar meu IP aos arquivos .htaccess. Obrigado. Fiz uma modificação no FreeBSD: who am i | awk '{print $6}' | sed 's/[()]//g' | sed 's/\./\\./g' A última parte escapa aos pontos.
precisa saber é o seguinte
5

Melhorando em uma resposta prévia. Dá o endereço IP em vez do nome do host. --ips não disponíveis no OS X.

who am i --ips|awk '{print $5}' #ubuntu 14

mais universal, altere US $ 5 a US $ 6 para o OS X 10.11:

WORKSTATION=`who -m|awk '{print $5}'|sed 's/[()]//g'`
WORKSTATION_IP=`dig +short $WORKSTATION`
if [[ -z "$WORKSTATION_IP" ]]; then WORKSTATION_IP="$WORKSTATION"; fi
echo $WORKSTATION_IP
SeeBenClick
fonte
2
netstat -tapen | grep ssh | awk '{ print $4}'
Sébastien Moreau
fonte
Não funciona em CentOS 6.9 (net-tools 1.60 netstat 1,42)(No info could be read for "-p": geteuid()=507 but you should be root.)
Jeff
@Jeff sudo ss -tapen | grep ssh | awk '{ print $4}'|grep -v ':22$'funciona?
Alexx Roche
2

Você pode obtê-lo de maneira programática por meio de uma biblioteca SSH ( https://code.google.com/p/sshxcute )

public static String getIpAddress() throws TaskExecFailException{
    ConnBean cb = new ConnBean(host, username, password);
    SSHExec ssh = SSHExec.getInstance(cb);
    ssh.connect();
    CustomTask sampleTask = new ExecCommand("echo \"${SSH_CLIENT%% *}\"");
    String Result = ssh.exec(sampleTask).sysout;
    ssh.disconnect();   
    return Result;
}
vineetv2821993
fonte
1

O netstat funcionará (no topo, algo como isto) tcp 0 0 10.x.xx.xx: ssh someipaddress.or.domainame: 9379 ESTABELECIDO

aric
fonte
Muito obrigado por esta resposta, acabei fazendo 'netstat | grep ssh '.
Ross Aiken
Por motivos de segurança, isso é ruim porque qualquer pessoa pode estar conectada a essa porta, não apenas a você.
precisa saber é o seguinte
1
netstat -tapen | grep ssh | awk '{ print $10}'

Resultado:

dois # no meu experimento

netstat -tapen | grep ssh | awk '{ print $4}' 

fornece o endereço IP.

Resultado:

127.0.0.1:22 # in my experiment

Mas os resultados são misturados com outros usuários e outras coisas. Precisa de mais trabalho.

Gerard
fonte
minha netstat só dá o endereço de um truncado para IPv6 e "127.0.0.1:22" é o servidor em vez do cliente, (que foi especificado na pergunta.)
Alexx Roche
1

um tópico mais antigo com muitas respostas, mas nenhum é exatamente o que eu estava procurando, por isso estou contribuindo com o meu:

sshpid=$$
sshloop=0
while [ "$sshloop" = "0" ]; do
        if [ "$(strings /proc/${sshpid}/environ | grep ^SSH_CLIENT)" ];
then
                read sshClientIP sshClientSport sshClientDport <<< $(strings /proc/${sshpid}/environ | grep ^SSH_CLIENT | cut -d= -f2)
                sshloop=1
        else
                sshpid=$(cat /proc/${sshpid}/status | grep PPid | awk '{print $2}')
                [ "$sshpid" = "0" ] && sshClientIP="localhost" && sshloop=1
        fi
done

esse método é compatível com ssh direto, usuários sudoed e sessões de tela. ele percorrerá a árvore do processo até encontrar um pid com a variável SSH_CLIENT e registrará seu IP como $ sshClientIP. se ficar muito alto na árvore, ele gravará o IP como 'localhost' e sairá do loop.

Andrej
fonte
0

Geralmente, há uma entrada de log em / var / log / messages (ou similar, dependendo do sistema operacional) que você pode receber com o nome de usuário.

Daniel Schneller
fonte
0

Linux: quem sou eu | awk '{print $ 5}' | sed 's / [()] // g'

AIX: quem sou eu | awk '{print $ 6}' | sed 's / [()] // g'

pfrandsen
fonte
0

Procure por conexões SSH para a conta "myusername";

Pegue a primeira sequência de resultados;

Pegue a 5a coluna;

Divida por ":" e retorne a 1ª parte (o número da porta não é necessário, queremos apenas IP):

netstat -tapen | grep "sshd: myusername" | cabeça -n1 | awk '{split ($ 5, a, ":"); imprima um [1]} '


Outra maneira:

quem sou eu | awk '{l = length ($ 5) - 2; print substr ($ 5, 2, l)} '

Nex
fonte
sudo ss -tapen | grep "sshd: $(whoami)"|head -n1|awk '{split($5, a, ":"); print a[1]}'diz que meu cliente ssh é 2a02e seu "Outra maneira:" diz #tmux(2445).%3
Alexx Roche
0

Supondo que ele abra uma sessão interativa (ou seja, aloque um pseudo terminal ) e você tenha acesso ao stdin, você pode chamar um ioctl nesse dispositivo para obter o número do dispositivo (/ dev / pts / 4711) e tentar encontrá-lo em / var / run / utmp (onde também haverá o nome de usuário e o endereço IP de onde a conexão se originou).

mihi
fonte
0

Um polegar para a resposta de @Nikhil Katre:

O comando mais simples para obter os últimos 10 usuários conectados à máquina é last|head.

Para obter todos os usuários, basta usar o lastcomando

Aquele que usa whoou pinkyfez o que é basicamente solicitado. Mas Mas Mas eles não fornecem informações sobre sessões históricas.

O que também pode ser interessante se você quiser conhecer alguém que acabou de fazer login e sair quando você inicia esta verificação.

se for um sistema multiusuário. Eu recomendo adicionar a conta de usuário que você está procurando:

last | grep $USER | head

EDITAR:

No meu caso, $ SSH_CLIENT e $ SSH_CONNECTION não existem.

Kangqiao Zhao
fonte
0

O comando mais simples para obter os últimos 10 usuários conectados à máquina é last|head. Para obter todos os usuários, basta usar o lastcomando

Nikhil Katre
fonte
0

Estou recebendo a seguinte saída do who -m --ipsDebian 10:

root pts / 0 dez 4 06:45 123.123.123.123

Parece que uma nova coluna foi adicionada. Portanto, as tentativas de {print $5}" tomar a quinta coluna " não funcionam mais.

Tente o seguinte:

who -m --ips | egrep -o '([0-9]{1,3}\.){3}[0-9]{1,3}'

Fonte:

aexl
fonte