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

问题描述 投票:0回答:19

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

有没有办法自动找出用户连接的IP地址?

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

linux networking ssh ip-address
19个回答
346
投票

检查是否有一个名为:

的环境变量
$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

130
投票

您可以使用命令:

server:~# pinky

这会给你这样的东西:

Login      Name                 TTY    Idle   When                 Where 

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

41
投票

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

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

22
投票

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

who

14
投票
who | cut -d"(" -f2 |cut -d")" -f1

6
投票

改进之前的答案。提供 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

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。


5
投票

获取最近登录计算机的用户列表的简单命令是

last
。这是最近的第一个排序,因此
last | head -n 1
将显示最后一次登录。但这可能不是当前登录的用户。

输出示例:

root     pts/0        192.168.243.99   Mon Jun  7 15:07   still logged in   
admin    pts/0        192.168.243.17   Mon Jun  7 15:06 - 15:07  (00:00)    
root     pts/0        192.168.243.99   Mon Jun  7 15:02 - 15:06  (00:03)    
root     pts/0        192.168.243.99   Mon Jun  7 15:01 - 15:02  (00:00)    
root     pts/0        192.168.243.99   Mon Jun  7 13:45 - 14:12  (00:27)    
root     pts/0        192.168.243.99   Mon May 31 11:20 - 12:35  (01:15)    
...

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

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

2
投票

一个较旧的线程,有很多答案,但没有一个是我想要的,所以我贡献了我的:

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”并离开循环。


2
投票

我在 Debian 10 上从

who -m --ips
获得以下输出:

根点/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}'

来源:


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

输出:

我的实验中有两个#

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

给出IP地址。

输出:

127.0.0.1:22 # in my experiment

但是结果与其他用户和其他东西混合在一起。它需要更多的工作。


0
投票

假设他打开一个交互式会话(即分配一个伪终端)并且您可以访问标准输入,您可以在该设备上调用ioctl来获取设备号(/dev/pts/4711)并尝试在 /var/run/utmp 中找到那个(其中还有用户名和连接源自的 IP 地址)。


-1
投票

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


-1
投票

netstat 可以工作(在顶部类似这样) tcp 0 0 10.x.xx.xx:ssh someipaddress.or.domainname:9379 已建立


-1
投票

Linux:我是谁 | awk '{print $5}' | sed 's/[()]//g'

AIX:我是谁 | awk '{print $6}' | sed 's/[()]//g'


-1
投票

搜索“myusername”帐户的 SSH 连接;

获取第一个结果字符串;

取第5列;

用“:”分割并返回第一部分(不需要端口号,我们只需要 IP):

netstat -tapen | grep "sshd: 我的用户名" |头 -n1 | awk '{split($5, a, ":");打印[1]}'


另一种方式:

我是谁 | awk '{l = 长度($5) - 2;打印 substr($5, 2, l)}'


-1
投票

为@Nikhil Katre 的回答点赞:

获取最近登录计算机的 10 个用户的最简单命令是

last|head

要获取所有用户,只需使用

last
命令

使用

who
pinky
的人做了基本上要求的事情。但是但是但是他们不提供历史会话信息。

如果您想认识刚刚登录的人并且 当您开始此检查时已经注销。

如果是多用户系统。我建议添加您正在寻找的用户帐户:

last | grep $USER | head

编辑:

在我的例子中,$SSH_CLIENT 和 $SSH_CONNECTION 都不存在。

© www.soinside.com 2019 - 2024. All rights reserved.