Programing

SSH 세션에서 클라이언트의 IP 주소 찾기

crosscheck 2020. 6. 14. 10:32
반응형

SSH 세션에서 클라이언트의 IP 주소 찾기


SSH 를 사용하여 서버에 로그인하는 사람이 실행할 스크립트가 있습니다 .

사용자가 연결 한 IP 주소를 자동으로 찾는 방법이 있습니까?

물론 사용자에게 요청할 수는 있지만 (프로그래머에게는 도구이므로 아무런 문제가 없습니다), 방금 알게되면 더 시원해질 것입니다.


다음과 같은 환경 변수가 있는지 확인하십시오.

$SSH_CLIENT 

또는

$SSH_CONNECTION

(또는 다른 환경 변수) 사용자가 로그인 할 때 설정됩니다. 그런 다음 사용자 로그인 스크립트를 사용하여 처리하십시오.

IP를 추출하십시오.

$ echo $SSH_CLIENT | awk '{ print $1}'
1.2.3.4
$ echo $SSH_CONNECTION | awk '{print $1}'
1.2.3.4

다음 명령을 사용할 수 있습니다.

server:~# pinky

그것은 당신에게 다음과 같은 somehting을 줄 것입니다 :

Login      Name                 TTY    Idle   When                 Where 

root       root                 pts/0         2009-06-15 13:41     192.168.1.133

IP 주소 만 얻으려면 다음을 시도하십시오.

who am i|awk '{ print $5}'

Linux 시스템에서 다음 명령을 입력하십시오.

who

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

이것을 사용하여 ssh를 통해 로그인 할 때 세션의 DISPLAY 변수를 결정하고 원격 X를 표시해야합니다.


 who | cut -d"(" -f2 |cut -d")" -f1

사전 답변 개선. 호스트 이름 대신 IP 주소를 제공합니다. --ip는 OS X에서 사용할 수 없습니다.

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

보다 보편적 인 OS X 10.11의 경우 5 달러에서 6 달러로 변경 :

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

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

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

산출:

내 실험에서 두 #

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

IP 주소를 제공합니다.

산출:

127.0.0.1:22 # in my experiment

그러나 결과는 다른 사용자 및 물건과 혼합되어 있습니다. 더 많은 작업이 필요합니다.


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;
}

netstat는 (이와 같은 최상위에서) 작동합니다. tcp 0 0 10.x.xx.xx : ssh someipaddress.or.domainame : 9379 ESTABLISHED


리눅스 : 내가 누구야 | awk '{print $ 5}'| sed 's / [()] // g'

AIX : 나는 누구인가 | awk '{print $ 6}'| sed 's / [()] // g'


"myusername"계정에 대한 SSH 연결을 검색하십시오.

첫 번째 결과 문자열을 가져옵니다.

다섯 번째 열을 가져 가라.

":"으로 나누고 첫 번째 부분을 반환합니다 (포트 번호는 필요하지 않으며 IP 만 원함).

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


Another way:

who am i | awk '{l = length($5) - 2; print substr($5, 2, l)}'


Usually there is a log entry in /var/log/messages (or similar, depending on your OS) which you could grep with the username.


Assuming he opens an interactive session (that is, allocates a pseudo terminal) and you have access to stdin, you can call an ioctl on that device to get the device number (/dev/pts/4711) and try to find that one in /var/run/utmp (where there will also be the username and the IP address the connection originated from).


an older thread with a lot of answers, but none are quite what i was looking for, so i'm contributing mine:

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

this method is compatible with direct ssh, sudoed users, and screen sessions. it will trail up through the process tree until it finds a pid with the SSH_CLIENT variable, then record its IP as $sshClientIP. if it gets too far up the tree, it will record the IP as 'localhost' and leave the loop.


One thumb up for @Nikhil Katre's answer :

Simplest command to get the last 10 users logged in to the machine is last|head.

To get all the users simply use last command

The one using who or pinky did what is basically asked. But But But they don't give historical sessions info.

Which might also be interesting if you want to know someone who has just logged in and logged out already when you start this checking.

if it is a multiuser system. I recommand add the user account you are looking for:

last | grep $USER | head

EDIT:

In my case, both $SSH_CLIENT and $SSH_CONNECTION do not exist.


Simplest command to get the last 10 users logged in to the machine is last|head.

To get all the users simply use last command


Try the following to get just the IP address via SSH:

Command: ifconfig

Example:

stalinrajindian@ubuntuserver:~$ ifconfig
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.30.3.27  netmask 255.255.255.0  broadcast 172.30.3.255
        inet6 fe80::a00:27ff:fe8b:9986  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:8b:99:86  txqueuelen 1000  (Ethernet)
        RX packets 4876  bytes 1951791 (1.9 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 775  bytes 73783 (73.7 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 78  bytes 5618 (5.6 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 78  bytes 5618 (5.6 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

참고URL : https://stackoverflow.com/questions/996231/find-the-ip-address-of-the-client-in-an-ssh-session

반응형