使用VisualVM通过防火墙连接到远程jstatd实例

Ben*_*ron 17 java linux freebsd

可能重复:
VisualVM over ssh

我正在写这个问题并回答它,因为我今天花了几个小时才开始工作,我在这里找不到任何答案.希望这对其他人有帮助.如果你有另一个解决方案,而不是我最终使用的解决方案,请随时回答这个问题.如果你的更好,我会接受你的.

问题:我正在尝试使用VisualVM和jstatd监视我的FreeBSD服务器上的一些自制java应用程序(这也应该适用于Linux服务器),但我无法让VisualVM列出服务器上的进程,即使我转发我的防火墙中分配的和随机的jstatd端口,可以看到使用sockstat建立的连接.

Ben*_*ron 35

我没有在每次运行jstatd时创建防火墙规则(因为它每次都烦人地选择一个新的随机端口),而是让它与SSH隧道一起工作.

首先,我在服务器上运行jstatd以找到我需要隧道的端口.这是通过(在我的情况下)首先创建一个名为tools.policy的策略文件来完成的,其中包含以下内容:

grant codebase "file:${java.home}/../lib/tools.jar" {
    permission java.security.AllPermission;
};
Run Code Online (Sandbox Code Playgroud)

然后运行以下命令: jstatd -J-Djava.security.policy=tools.policy

然后我确定jstatd随机端口正在运行sockstat | grep jstat(可能需要netstat在Linux 上使用,我不确定).

然后让我们说随机端口是55663,我在我的本地机器上创建了两个SSH隧道,一个用于标准的jstatd端口1099,另一个用于55663,在两个终端窗口中运行以下命令(在Windows上没有这样做,但是我很确定putty可以做到这一点):

ssh -L 1099:localhost:1099 login_name@host_name

ssh -L 55663:localhost:55663 login_name@host_name

两个隧道打开后,我打开VisualVM并右键单击左侧的"Local"机器并选择"Add jstatd Connection".我单击右侧的"添加默认值"按钮,确保端口设置为1099.我点击"确定"按钮保存它,并立即看到我的远程Java进程显示在"本地"部分.

  • 您可以使用一个ssh命令隧道两个端口,例如`ssh -L 1234:localhost:1234 -L 5555:somehost:5678 user @ hostname (4认同)