在SSH会话中查找客户端的IP地址


166

我有一个脚本,该脚本将由使用SSH登录到服务器的人运行

有没有一种方法可以自动找出用户连接的IP地址?

当然,我可以问用户(这是程序员的工具,所以没问题),但是如果我发现了,它会更酷。


5
提议转移到
服务器故障

Answers:


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 2015年

2
这对我来说是REMOTEHOST。
dramzy

5
仅适用于非受训用户。例如,如果您有一个ssh用户,然后升级到root用户,则会创建一个新的shell并丢失这些变量,除非您可以追溯到树中以找到原始的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

这样会给您带来一些麻烦:

Login      Name                 TTY    Idle   When                 Where 

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

13
太好了:-)书呆子幽默再次。根据pinky --helpA lightweight 'finger' program; print user information. The utmp file will be /var/run/utmp.
克里斯·伍兹

为什么输出中的“我的位置”仅显示计算机名称,而不显示IP地址?
isaganiesteron 2014年

可能是您的计算机中配置了名称服务器。
vncprado 2015年

小指将显示所有已登录用户,而不仅仅是您自己
Andrej

33

请尝试以下操作以获取IP地址:

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

非常确定如果您编写whoami,您将获得登录用户的名称。没有第五件事或IP打印对不起。但是whoami是有用的命令
gerard

15
who am iwhoami至少在我的Linux上是!= 。还有第五件事,它是客户端的主机名。
kbulgrien 2014年

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而没有反向DNS答案。感谢您的帮助who am i
伊凡(Yvan)

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

19

只需在Linux机器上键入以下命令:

who


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 2014年

5

改进先前的答案。提供IP地址而不是主机名。--ips在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

您可以通过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.or.domainame:9379已建立


非常感谢您的回答,我最终做了'netstat | grep ssh”。
Ross Aiken 2013年

出于安全原因,这很糟糕,因为任何人都可以连接到该端口,而不仅仅是您。
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,受过激励的用户和屏幕会话兼容。它会一直跟踪到进程树,直到找到带有SSH_CLIENT变量的pid,然后将其IP记录为$ sshClientIP。如果距离树太远,它将IP记录为“ localhost”并离开循环。


0

通常,在/ var / log / messages中(或类似情况,取决于您的操作系统)中有一个日志条目,您可以使用用户名grep。


0

Linux:我是谁?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 = length($ 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
Alexx Roche


0

@Nikhil Katre的答案表示大拇指:

获取最近10位登录到计算机的用户的最简单命令是 last|head

要获得所有用户,只需使用last命令

一个使用whopinky做了基本询问的事情。但是,但是,他们不提供历史会议信息。

如果您想在开始进行此检查时认识刚登录并已经注销的人,这可能也很有趣。

如果是多用户系统。我建议添加您要查找的用户帐户:

last | grep $USER | head

编辑:

就我而言,$ SSH_CLIENT和$ SSH_CONNECTION都不存在。



0

我从who -m --ipsDebian 10上获得以下输出:

root pts / 0 Dec 4 06:45 123.123.123.123

似乎已添加了新列,因此{print $5}采取第5列 ”的尝试不再起作用。

试试这个:

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

资源:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.