如何在Java中查找哪个用户正在使用端口

时间:2013-07-30 06:51:51

标签: java web-applications localhost port

我想将端口号映射到用户(运行绑定到端口的进程的linux用户)。 我怎么能在java中做到这一点?

我知道我可以去shell并运行将端口映射到PID的bash命令,然后将PID映射到用户,但是如果可以的话我想将它保存在java中。

更一般的问题是:我有一个webapp应用程序接收来自localhost的请求,我想知道哪个本地用户执行了HttpServletRequest,所以我可以附加适当的权限。

背景

我正在为所有远程连接使用spring security。但是,我有一小部分应用程序(与webapp分开)与应用程序服务器一起在本地运行,并且该应用程序使用linux用户机制进行身份验证。因此,我绕过了localhost的服务器身份验证规则(假设允许所有localhost访问)。问题在于授权 - 我需要识别运行localhost请求的用户。任何想法我怎么能实现这个目标?

1 个答案:

答案 0 :(得分:0)

这是Linux依赖代码,但不难移植到Windows。

这不是Servlet代码,但在这种情况下也适用:

假设我有一个等待accept()调用的ServerSocket。当它收到客户端请求时,它会在另一个端口创建一个Socket来处理该“远程”请求。

ServerSocket ss = new ServerSocket(2000);
System.out.println("Listening on local port : " + ss.getLocalPort());

while(...)
{
 Socket s = ss.accept();
 System.out.println("accepted client request, opened local port : " + s.getPort());
 ...
}

因此,您需要将s.getPort()的输出从上面的代码段提供给以下程序的main()方法。

public class FindUserByPort
{
  public static void main(String[] args) throws Exception
  {
    String cmd = "netstat -anp | grep ";
    int port = Integer.valueOf(args[0]);
    cmd = cmd + port ;

    Process pr = Runtime.getRuntime().exec(cmd);
    InputStream is = pr.getInputStream();

    BufferedReader br = new BufferedReader(new InputStreamReader(is));
    String line = null;
    List<Integer> pIDs = new ArrayList<Integer>();

    while ((line = br.readLine()) != null)
    {
      if (line.contains("127.0.0.1:" + port))
      {
        String pidPname = line.substring(line.indexOf("ESTABLISHED") + "ESTABLISHED".length());
        pidPname = pidPname.trim();
        String pid = pidPname.split("/")[0];
        pIDs.add(Integer.valueOf(pid));
      }
    }
    if (pIDs.size() > 0)
    {
      for (int pid : pIDs)
      {
        String command = "top -n1 -b -p " + pid ;
        Process p = Runtime.getRuntime().exec(command);
        InputStream _is = p.getInputStream();

        BufferedReader _br = new BufferedReader(new InputStreamReader(_is));
        String _line = null;
        while ((_line = _br.readLine()) != null)
        {
          _line = _line.trim();
          if(_line.startsWith(String.valueOf(pid)))
          {
            String[] values = _line.split(" ");
            System.out.println("pid : " + pid + ", user : " + values[1]);
          }
        }
        _is.close();
        _br.close();
      }
    }
    is.close();
    br.close();
  }
}