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

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

是否有一种方法可以自动找出用户从哪个IP地址连接?

当然,我可以询问用户(这是程序员的工具,所以这没有问题),但如果我自己找到答案,那就更好了。

258019 次浏览

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

检查是否有一个环境变量叫做:

$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

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

您可以使用命令:

server:~# pinky

它会给你这样的东西:

Login      Name                 TTY    Idle   When                 Where


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

netstat将工作(在顶部像这样) TCP 0 0 10.x.xx。xx: ssh someipaddress.or。domainame: 9379建立了< / p >

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

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

Linux:我是谁| awk的{打印5美元}| sed的/ (())/ / g’

AIX:我是谁| awk的{打印6美元}| sed的/ (())/ / g’

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

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

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变量。

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

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

获取第一个结果字符串;

以第五纵队为例;

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

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


另一种方法:

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

在你的Linux机器上输入以下命令:

who

改进之前的答案。给出ip地址而不是主机名。——ip在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

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

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用户和screen会话。它将遍历进程树,直到找到带有SSH_CLIENT变量的pid,然后将其IP记录为$sshClientIP。如果它在树上走得太远,它将把IP记录为“localhost”并离开循环。

获取最近登录到机器的用户列表的简单命令是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)
...
 who | cut -d"(" -f2 |cut -d")" -f1

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

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

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

使用whopinky的函数完成了基本的要求。但是但是但是他们不提供历史会话信息。

如果你想知道一个刚刚登录的人,这可能也很有趣

.

.

.

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

last | grep $USER | head

编辑:

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

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

root pts/0 12月4日06:45 123.123.123.123

看起来像是添加了一个新列,所以{print $5}或"以第五列为例"尝试不再工作。

试试这个:

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

来源: