繁体   English   中英

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

[英]Find the IP address of the client in an SSH session

我有一个脚本,由使用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

这会给你这样的东西:

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 | cut -d"(" -f2 |cut -d")" -f1
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 登录并需要显示远程 X 时,我使用它来确定会话的 DISPLAY 变量。

改进先前的答案。 提供 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
netstat -tapen | grep ssh | awk '{ print $4}'

您可以通过 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;
}

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

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 记录为“本地主机”并离开循环。

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

输出:

两个 # 在我的实验中

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

给出 IP 地址。

输出:

127.0.0.1:22 # in my experiment

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

获取最近登录到机器的用户列表的简单命令是last 这是最近订购的,所以last | head -n 1 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)    
...

我从 Debian 10 上的who -m --ips得到以下输出:

根 pts/0 Dec 4 06:45 123.123.123.123

看起来像添加了一个新列,因此{print $5}或“ take 5th column ”尝试不再起作用。

尝试这个:

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

来源:

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

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

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

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

取第一个结果字符串;

取第 5 列;

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

netstat -tapen | grep "sshd: myusername" | 头-n1 | awk '{split($5, a, ":"); 打印一个[1]}'


其它的办法:

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

对@Nikhil Katre 的回答竖起大拇指:

让最后 10 个用户登录到机器的最简单命令是last|head

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

使用whopinky那个基本上是被问到的。 但是但是他们不提供历史会话信息。

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

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

last | grep $USER | head

编辑:

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

netstat 将工作(在顶部像这样) tcp 0 0 10.x.xx.xx:ssh someipaddress.or.domainame:9379 ESTABLISHED

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

尝试以下方法通过SSH获取IP地址:

Command: ifconfig

例:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM