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

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

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


当前回答

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

who

其他回答

您可以通过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 | cut -d"(" -f2 |cut -d")" -f1

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

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 | 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)    
...