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


166

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

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

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


5
여전히 서버 오류로의 전환을 제안하지만 여전히 좋은 질문입니다.
BozoJoe

답변:


267

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

$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

@cwd "iptables -A INPUT -s 93.203.118.251 -p tcp --destination-port 443 -j DROP"명령에서 ip를 바꾸고 싶습니까?
wutzebaer

2
이것은 나를위한 REMOTEHOST였습니다.
dramzy

5
sudoed 사용자와 만 작동합니다. 예를 들어 ssh 사용자가 있고 루트로 에스컬레이션하는 경우 트리를 통해 추적하여 원래 ssh pid를 찾고 / proc / $ PID / environ에서 변수를 가져올 수 없으면 새 쉘이 작성되고 이러한 변수가 손실됩니다.
Andrej

5
stackoverflow.com/questions/428109/extract-substring-in-bash 덕분 에이 답변은 간단하게 향상 될 수 있습니다.${SSH_CLIENT%% *}
Jeff

@Andrej 살펴보기sudo -E
Jeff

105

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

server:~# pinky

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

Login      Name                 TTY    Idle   When                 Where 

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

13
대단해 :-) 얼간이 유머 다시 한번 ftw. 에 따르면 pinky --help:A lightweight 'finger' program; print user information. The utmp file will be /var/run/utmp.
크리스 우즈

내 출력의 내 '어디에'가 IP 주소가 아닌 컴퓨터 이름 만 표시합니까?
isaganiesteron

컴퓨터에 네임 서버를 설정했을 것입니다.
vncprado 5

새끼가 표시됩니다 모두 자신뿐만 아니라, 사용자 로그인
안드레이

33

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

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

whoami를 작성하면 로그인 한 사용자의 이름이 표시됩니다. 인쇄 할 다섯 번째 또는 IP가 없습니다. 죄송합니다. 그러나 whoami는 유용한 명령입니다
gerard

15
who am i! = whoami적어도 내 리눅스에서는. 다섯 번째는 클라이언트의 호스트 이름입니다.
kbulgrien

5
다른 궁금한 who am i점이 있으시면 다음 페이지를 참조 who하십시오 If ARG1 ARG2 given, -m presumed: 'am i' or 'mom likes' are usual.. 따라서 실제로 두 단어가있는 모든 것이 작동합니다 who likes icecream.
jmiserez

3
이 답변을 바탕으로 who -m --ips|awk '{print $5}'IP 만 있고 리버스 DN 응답이 없도록 줄였습니다 . 도움을 주셔서 감사합니다 who am i!
Yvan

1
tmux 실패 : who am i|awk '{ print $5}' (tmux(2445).%3)
Alexx Roche



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

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


내 IP를 .htaccess 파일에 추가하는 데 유용한 하나의 라이너. 감사합니다. FreeBSD를 수정했습니다 who am i | awk '{print $6}' | sed 's/[()]//g' | sed 's/\./\\./g' . 마지막 부분은 점을 피합니다.
Olivier-interfaSys

5

사전 답변 개선. 호스트 이름 대신 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

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

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$'작동합니까?
Alexx Roche

2

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

1

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


이 답변에 대해 대단히 감사합니다. 나는 'netstat | grep ssh '.
Ross Aiken

보안상의 이유로 사용자뿐만 아니라 다른 사람이 해당 포트에 연결할 수 있기 때문에 이것은 나쁩니다.
CrazyCasta

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

산출:

내 실험에서 두 #

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

IP 주소를 제공합니다.

산출:

127.0.0.1:22 # in my experiment

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


내 NETSTAT는 IPv6의 잘린 주소를 제공하고 "127.0.0.1:22는"서버는 클라이언트가 아닌 것입니다 (질문에 지정되었습니다.)
알렉스 로슈에게

1

많은 답변을 가진 오래된 스레드이지만 아무도 내가 찾고있는 것이 아니므로 내 공헌하고 있습니다.

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

이 방법은 직접 ssh, sudoed 사용자 및 스크린 세션과 호환됩니다. SSH_CLIENT 변수로 pid를 찾을 때까지 프로세스 트리를 추적 한 다음 IP를 $ sshClientIP로 기록합니다. 트리에서 너무 멀어지면 IP를 'localhost'로 기록하고 루프를 떠납니다.


0

일반적으로 / var / log / messages (또는 OS에 따라 비슷한)에 사용자 이름으로 grep 할 수있는 로그 항목이 있습니다.


0

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

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


0

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

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

다섯 번째 열을 가져 가라.

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

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


또 다른 방법:

나는 누구인가 | awk '{l = 길이 ($ 5)-2; 인쇄 substr ($ 5, 2, l)} '


sudo ss -tapen | grep "sshd: $(whoami)"|head -n1|awk '{split($5, a, ":"); print a[1]}'라고 내 ssh 클라이언트는 출신 2a02과 "또 다른 방법 :"말한다tmux(2445).%3
알렉스 로슈


0

@Nikhil Katre의 답변에 대한 하나의 엄지 손가락 :

마지막 10 명의 사용자가 컴퓨터에 로그인하도록하는 가장 간단한 명령은 last|head입니다.

모든 사용자가 단순히 last명령을 사용하게하려면

기본적으로 요구되는 것을 사용 who하거나 pinky수행 한 사람 . 그러나 그러나 그들은 역사적인 세션 정보를 제공하지 않습니다.

이 검사를 시작할 때 방금 로그인하고 로그 아웃 한 사람을 알고 싶은 경우에도 흥미로울 수 있습니다.

다중 사용자 시스템 인 경우 찾고있는 사용자 계정을 추가하십시오.

last | grep $USER | head

편집하다:

필자의 경우 $ SSH_CLIENT와 $ SSH_CONNECTION이 모두 존재하지 않습니다.


0

마지막 10 명의 사용자가 컴퓨터에 로그인하도록하는 가장 간단한 명령은 last|head입니다. 모든 사용자를 얻으려면 단순히 last명령을 사용하십시오.


0

who -m --ips데비안 10 에서 다음과 같은 결과가 나타납니다 .

루트 pts / 0 12 월 4 일 06:45 123.123.123.123

새 열이 추가 된 것 같습니다. {print $5}" 5 번째 열을 가져옵니다 "시도가 더 이상 작동하지 않습니다.

이 시도:

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

출처:

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.