为JMX JConsole设置用户名密码登录

个人环境说明:
JAVA jdk1.6.0_20
IP地址:192.168.88.106
系统登陆用户名:Administrator


1,设置密码文件和权限
在jdk1.6.0_20\jre\lib\management中将jmxremote.password.template复制一份重命为
jmxremote.password。修改最后两行,将
#monitorRole  QED
#controlRole   R&D
前面的#号去掉。为什么后面解释。


然后修改jmxremote.password的文件权限为仅当前用户完全控制,所有者为当前用户,具体步骤如下:
Windows系统需要3个步骤:


在jmxremote.password文件上右键->属性,切换到安全选项卡。
点“高级”按钮,弹出“jmxremote.password的高级安全设置”窗口。
(1)删除所有用户对jmxremote.password文件的访问权限:
在“权限”选项卡中点“更改权限”,将“包括可从该对象的父项继承的权限”
复选框去掉,然后系统会弹出一个“Windows安全”警告,选择“删除”按钮。
删除成功后,权限项目栏会变成:“所有组或用户均不具有访问此对象的权限。但是该对象的所有者可以分配权限。”


(2)指定当前登陆用户对该文件有完全控制权限
点“添加”按钮,再点“高级”按钮,再点“立即查找”,在搜索结果中找当前系统的登陆用户双击添加进来。
注意不要选择那些带S结尾的,那个表示组,只能选择用户。我的是Administrator
返回后点确定,然后在弹出框中勾选“完全控制”。点确定返回刚开始的“jmxremote.password的高级安全设置”窗口。
(3)将所有者设置为当前系统的登陆用户
切换到所有者选项卡,点击“编辑”,双击选择当前系统的登陆用户,注意不要选择那些带S结尾的,那个表示组,只能选择用户。
最后一路确定。权限修改完毕。


Linux系统:
chmod 600 jmxremote.password 这个没试过,官方这么写的。


2,启动JMX服务端


下面这行命令我是在JDK的根目录执行的,
这里指定的端口号是10089,主机名称即当前计算机IP地址,不推荐设置成localhsot或者127.0.0.1,会导致在别的机子上连不上来。JAR包指定的是JDK自带的一个DEMO
java -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=10089 -Djava.rmi.server.hostname=192.168.88.106 -jar demo/jfc/Java2D/Java2Demo.jar 


3,启动JConsole
在JDK的bin目录执行jconsole.exe
选择远程进程,输入地址:
service:jmx:rmi:///jndi/rmi://192.168.88.106:10089/jmxrmi
也可以是 192.168.88.106:10089


用户名:controlRole  密码R&D
下面这个也可以,
用户名:monitorRole  密码QED
其实用的就是jmxremote.password文件里面写的用户名和密码,也可以添加几个用户的,
新添加的用户要到jdk1.6.0_20\jre\lib\management\jmxremote.access文件里面设置对应的权限。这个简单,
Ctrl+C Ctrl+V就搞定。


4,Windows权限设置最麻烦,JConsole只会提示连接失败,看不见详细原因。

附上JAVA调试连接用的代码,这个可以看失败原因:

public static void main(String[] args) {
		String hostName = "192.168.88.106";
		int portNum = 10089;
		
		try {
			JMXServiceURL u = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" 
					+ hostName + ":" + portNum + "/jmxrmi");

			Map auth = new HashMap();
			auth.put(JMXConnector.CREDENTIALS, new String[] { "controlRole", "R&D" });

			JMXConnector c = JMXConnectorFactory.connect(u, auth);
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}


你可能感兴趣的:(码砖日常)