赞
踩
我有一个脚本,由使用ssh登录到服务器的人运行。
有没有办法自动找出用户连接的IP地址?
当然,我可以问用户(这是一个程序员的工具,所以没问题),但如果我刚刚发现的话,会更酷。
建议转到服务器故障,不过还是个很好的问题
检查是否存在名为:
$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
@cwd我想替换这个命令"iptables-a input-s 93.203.118.251-p tcp--destination port 443-j drop"中的IP,这是可能的吗?
这是我的远程主机。
仅适用于非sudoed用户。例如,如果您有一个ssh用户,然后升级到根目录,那么将创建一个新的shell,并且这些变量将丢失,除非您可以通过树进行跟踪以找到原始ssh pid并从/proc/$pid/environn获取变量。
由于stackoverflow.com/questions/428109/extract-substring-in-bash,这个答案可以简单地改进为${SSH_CLIENT%% *}。
@安德烈调查了埃多克斯1〔1〕。
您可以使用以下命令:
server:~# pinky
这会给你带来这样的好处:
Login Name TTY Idle When Where
root root pts/0 2009-06-15 13:41 192.168.1.133
那太棒了:()又是一次呆板的幽默。根据pinky --help:A lightweight 'finger' program; print user information. The utmp file will be /var/run/utmp.
为什么输出中的my'where'只显示机器名而不显示IP地址?
可能您的计算机中配置了名称服务器。
Pinky将显示所有登录用户,而不仅仅是您自己。
尝试以下方法只获取IP地址:
who am i|awk '{ print $5}'
很肯定,如果你写下whoami,你会得到登录用户的名字。没有第五件事或IP要打印抱歉。但是whoami是一个有用的命令
EDOCX1,4!=whoami,至少在我的Linux上。还有第五件事,它是客户机的主机名。
对于其他对who am i感到疑惑的人来说:who的主页上写着:If ARG1 ARG2 given, -m presumed: 'am i' or 'mom likes' are usual.。所以任何有两个词的东西都是有效的,比如who likes icecream。
在这个答案的基础上,我把它简化为who -m --ips|awk '{print $5}',这样我只有IP,没有反向DNS答案。感谢您对who am i的帮助!
只需在Linux机器上键入以下命令:
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
当我通过ssh登录并需要显示远程x时,我使用它来确定会话的显示变量。
有用的一行程序将我的IP添加到.htaccess文件。谢谢您。我对freebsd做了修改:who am i | awk '{print $6}' | sed 's/[()]//g' | sed 's/\./\\./g',最后一部分避开了点。
who | cut -d"(" -f2 |cut -d")" -f1
改进先前的答案。提供IP地址而不是主机名。--ips在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 -tapen | grep ssh | awk '{ print $4}'
不适用于CentOS 6.9(net tools 1.60 netstat 1.42)(No info could be read for"-p": geteuid()=507 but you should be root.)。
您可以通过一个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;
}
netstat -tapen | grep ssh | awk '{ print $10}'
输出:
两个在我的实验中
netstat -tapen | grep ssh | awk '{ print $4}'
给出IP地址。
输出:
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已建立
非常感谢您的回答,我最后做了"netstat grep ssh"。
出于安全考虑,这很糟糕,因为任何人都可以连接到那个端口,而不仅仅是你。
一个大拇指指向@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
使用who或pinky的人做了基本要求。但他们不提供历史会议信息。
如果你想认识一个刚刚登录的人,开始检查时已注销。
如果是多用户系统。我建议添加您要查找的用户帐户:
last | grep $USER | head
编辑:
在我的例子中,$ssh_客户机和$ssh_连接都不存在。
通常在/var/log/messages(或类似的,取决于您的操作系统)中有一个日志条目,您可以使用用户名grep。
一个有很多答案的老线索,但没有一个是我正在寻找的,所以我贡献了我的:
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地址:
Command: ifconfig
例子:
stalinrajindian@ubuntuserver:~$ ifconfig
enp0s3: flags=4163 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
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 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。