我有一个脚本,将由一个人使用SSH登录到服务器运行。
是否有一种方法可以自动找出用户从哪个IP地址连接?
当然,我可以询问用户(这是程序员的工具,所以这没有问题),但如果我自己找到答案,那就更好了。
我有一个脚本,将由一个人使用SSH登录到服务器运行。
是否有一种方法可以自动找出用户从哪个IP地址连接?
当然,我可以询问用户(这是程序员的工具,所以这没有问题),但如果我自己找到答案,那就更好了。
当前回答
@Nikhil Katre的回答让我竖起大拇指:
让最后10个用户登录到计算机的最简单的命令是last|head。 要获取所有用户,只需使用last命令
使用who或pinky的人做了什么基本上是在问。但是但是但是他们不提供历史会话信息。
如果你想知道刚刚登录的人是谁,这可能也很有趣 当您开始检查时,已经注销了。
如果是多用户系统。我建议添加您正在寻找的用户帐户:
last | grep $USER | head
编辑:
在我的例子中,$SSH_CLIENT和$SSH_CONNECTION都不存在。
其他回答
在你的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
假设他打开了一个交互式会话(即分配了一个伪终端),而您可以访问stdin,您可以在该设备上调用ioctl以获得设备号(/dev/pts/4711),并尝试在/var/run/utmp中找到该设备号(其中还将有用户名和连接起源于的IP地址)。
netstat -tapen | grep ssh | awk '{ print $4}'
一个有很多答案的旧帖子,但没有一个是我想要的,所以我贡献了我的:
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”并离开循环。