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

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

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


当前回答

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

输出:

在我的实验中有两个

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

给出IP地址。

输出:

127.0.0.1:22 # in my experiment

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

其他回答

您可以使用命令:

server:~# pinky

它会给你这样的东西:

Login      Name                 TTY    Idle   When                 Where 

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

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

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

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

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

让最后10个用户登录到计算机的最简单的命令是last|head。 要获取所有用户,只需使用last命令

使用who或pinky的人做了什么基本上是在问。但是但是但是他们不提供历史会话信息。

如果你想知道刚刚登录的人是谁,这可能也很有趣 当您开始检查时,已经注销了。

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

last | grep $USER | head

编辑:

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