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
使用
如果你想认识一个刚刚登录的人,开始检查时已注销。
如果是多用户系统。我建议添加您要查找的用户帐户:
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 |