关于Linux:在ssh会话中查找客户机的IP地址

Find the IP address of the client in an SSH session

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

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

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


检查是否存在名为:

1
$SSH_CLIENT

1
$SSH_CONNECTION

(或任何其他环境变量)在用户登录时设置。然后使用用户登录脚本处理它。

提取IP:

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


您可以使用以下命令:

1
server:~# pinky

这会给你带来这样的好处:

1
2
3
Login      Name                 TTY    Idle   When                 Where

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


尝试以下方法只获取IP地址:

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


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

1
who

1
2
3
4
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时,我使用它来确定会话的显示变量。


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


改进先前的答案。提供IP地址而不是主机名。--ips在OS X上不可用。

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

更普遍的做法是,将OS X 10.11的价格从5美元改为6美元:

1
2
3
4
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

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


您可以通过一个ssh库(https://code.google.com/p/sshxcute)以编程方式获得它。

1
2
3
4
5
6
7
8
9
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 -tapen | grep ssh | awk '{ print $10}'

输出:

两个在我的实验中

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

给出IP地址。

输出:

1
127.0.0.1:22 # in my experiment

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


搜索"myusername"帐户的ssh连接;

取第一个结果字符串;

取第5列;

拆分为":"并返回第一部分(不需要端口号,我们只需要IP):

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

另一种方式:

我是谁awk'l=长度($5)-2;打印子行($5,2,l)


linux:我是谁awk'打印$5'sed's/[()]//g'

艾克斯:我是谁awk'打印$6'sed's/[()]//g'


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


一个大拇指指向@nikhil katre的答案:

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

使用whopinky的人做了基本要求。但他们不提供历史会议信息。

如果你想认识一个刚刚登录的人,开始检查时已注销。

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

1
last | grep $USER | head

编辑:

在我的例子中,$ssh_客户机和$ssh_连接都不存在。


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


一个有很多答案的老线索,但没有一个是我正在寻找的,所以我贡献了我的:

1
2
3
4
5
6
7
8
9
10
11
12
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_客户机变量的PID,然后将其IP记录为$ssh client ip。如果它在树上走得太远,它会将IP记录为"localhost",然后离开循环。


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


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


尝试以下操作,仅通过ssh获取IP地址:

1
Command: ifconfig

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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