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

时间:2009-06-15 13:50:17

标签: linux networking ssh ip-address

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

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

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

20 个答案:

答案 0 :(得分:230)

检查是否存在名为:

的环境变量
$SSH_CLIENT 

OR

$SSH_CONNECTION

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

提取IP:

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

答案 1 :(得分:96)

您可以使用命令:

server:~# pinky

会给你这样的东西:

Login      Name                 TTY    Idle   When                 Where 

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

答案 2 :(得分:29)

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

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

答案 3 :(得分:16)

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

who

答案 4 :(得分: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 :(得分:3)

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

答案 6 :(得分:3)

改进先前的答案。提供IP地址而不是主机名。 - OS X上没有 - 。

def rank3(x,y,z, ascending=True):
    return tuple(sorted((x,y,z), reverse=not ascending))

更通用,OS X 10.11改为5美元到6美元:

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

答案 7 :(得分: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;
}

答案 8 :(得分:2)

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

输出:

我实验中的两个#

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

给出IP地址。

输出:

127.0.0.1:22 # in my experiment

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

答案 9 :(得分:2)

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

答案 10 :(得分:1)

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

取第一个结果字符串;

取第5栏;

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

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


另一种方式:

我是谁? awk' {l =长度($ 5) - 2; print substr($ 5,2,1 l)}'

答案 11 :(得分:1)

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

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

答案 12 :(得分:1)

netstat会起作用(在这样的顶部) tcp 0 0 10.x.xx.xx:ssh someipaddress.or.domainame:9379 ESTABLISHED

答案 13 :(得分:0)

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

答案 14 :(得分:0)

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

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

答案 15 :(得分:0)

  

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

     

要让所有用户只使用last命令

答案 16 :(得分:0)

假设他打开一个交互式会话(即分配一个pseudo terminal)并且你有权访问stdin,你可以call an ioctl on that device获取设备号(/ dev / pts / 4711)并尝试在/var/run/utmp中找到一个(其中也会有用户名和连接源自的IP地址)。

答案 17 :(得分:0)

@Nikhil Katre的答案:

  

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

     

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

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

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

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

last | grep $USER | head

编辑:

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

答案 18 :(得分:0)

我从who -m --ips的Debian 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}'

来源:

答案 19 :(得分:-3)

尝试以下方法通过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