我想将端口号映射到用户(运行绑定到端口的进程的linux用户)。 我怎么能在java中做到这一点?
我知道我可以去shell并运行将端口映射到PID的bash命令,然后将PID映射到用户,但是如果可以的话我想将它保存在java中。
更一般的问题是:我有一个webapp应用程序接收来自localhost的请求,我想知道哪个本地用户执行了HttpServletRequest,所以我可以附加适当的权限。
我正在为所有远程连接使用spring security。但是,我有一小部分应用程序(与webapp分开)与应用程序服务器一起在本地运行,并且该应用程序使用linux用户机制进行身份验证。因此,我绕过了localhost的服务器身份验证规则(假设允许所有localhost访问)。问题在于授权 - 我需要识别运行localhost请求的用户。任何想法我怎么能实现这个目标?
答案 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();
}
}