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

我有一个脚本是由一个用SSHlogin到服务器的人运行的。

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

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

检查是否有一个名为:

$SSH_CLIENT 

要么

 $SSH_CONNECTION 

(或任何其他环境variables),用户login时设置。然后使用用户login脚本进行处理。

提取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机器上input以下命令:

 who 
 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 

我通过sshlogin时使用这个来确定会话的DISPLAYvariables,并且需要显示远程X.

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

输出:

两个#在我的实验

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

给出IP地址。

输出:

 127.0.0.1:22 # in my experiment 

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

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

提前答复。 给出ip地址而不是主机名。 – OS在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将工作(在顶部是这样的)tcp 0 0 10.x.xx.xx:ssh someipaddress.or.domainame:9379 ESTABLISHED

search“myusername”帐户的SSH连接;

取第一个结果string;

以第五栏;

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

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


其他方式:

我是谁? awk'{l = length($ 5) – 2; print substr($ 5,2,l)}'

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

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

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

假设他打开了一个交互式会话(也就是分配一个伪terminal )并且可以访问stdin,那么可以调用该设备上的ioctl来获取设备编号(/ dev / pts / 4711),并尝试find该设备/ var / run / utmp (其中也会有用户名和IP地址来自连接)。

一个有很多答案的旧线程,但没有一个是我正在寻找的东西,所以我贡献我的:

 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用户和屏幕会话兼容。 它将通过进程树进行追踪,直到find带有SSH_CLIENTvariables的pid,然后将其IPlogging为$ sshClientIP。 如果树太高,它会将IPlogging为“localhost”并离开循环。

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

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