Ho una soluzione per questo:
Se il processo Java è in esecuzione su Linux dietro un firewall e si desidera avviare JConsole / Java VisualVM / Java Mission Control su Windows sulla macchina locale per collegarlo alla porta JMX del processo Java .
Devi accedere alla tua macchina Linux tramite login SSH. Tutte le comunicazioni verranno incanalate sulla connessione SSH.
SUGGERIMENTO: questa soluzione funziona indipendentemente dalla presenza o meno di un firewall.
Svantaggio: ogni volta che riavvii il processo Java, dovrai ripetere tutti i passaggi da 4 a 9.
1. Hai bisogno della suite putty per la tua macchina Windows da qui:
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
Almeno il putty.exe
2. Definisci una porta libera sulla tua macchina Linux:
<jmx-remote-port>
Esempio:
jmx-remote-port = 15666
3. Aggiungere argomenti al processo java sulla macchina Linux
Questo deve essere fatto esattamente in questo modo. Se è fatto come di seguito, funziona per macchine Linux dietro firewall (funziona a causa -Djava.rmi.server.hostname=localhost
dell'argomento).
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=<jmx-remote-port>
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.local.only=false
-Djava.rmi.server.hostname=localhost
Esempio:
java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=15666 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.local.only=false -Djava.rmi.server.hostname=localhost ch.sushicutta.jmxremote.Main
4. Ottieni Process-Id del tuo processo Java
ps -ef | grep <java-processname>
result ---> <process-id>
Esempio:
ps -ef | grep ch.sushicutta.jmxremote.Main
result ---> 24321
5. Trova la porta arbitraria per il download degli stub RMIServer
Il processo java apre una nuova porta TCP sulla macchina linux, dove gli RMI Server-Stub saranno disponibili per il download. Questa porta deve anche essere disponibile tramite SSH Tunnel per ottenere una connessione alla Java Virtual Machine.
Con netstat -lp
questa porta si possono trovare anche i lsof -i
suggerimenti su quale porta è stata aperta dal processo java.
NOTA: questa porta cambia sempre quando viene avviato il processo java.
netstat -lp | grep <process-id>
tcp 0 0 *:<jmx-remote-port> *:* LISTEN 24321/java
tcp 0 0 *:<rmi-server-port> *:* LISTEN 24321/java
result ---> <rmi-server-port>
Esempio:
netstat -lp | grep 24321
tcp 0 0 *:15666 *:* LISTEN 24321/java
tcp 0 0 *:37123 *:* LISTEN 24321/java
result ---> 37123
6. Abilita due tunnel SSH dalla tua macchina Windows con putty
Source port: <jmx-remote-port>
Destination: localhost:<jmx-remote-port>
[x] Local
[x] Auto
Source port: <rmi-server-port>
Destination: localhost:<rmi-server-port>
[x] Local
[x] Auto
Esempio:
Source port: 15666
Destination: localhost:15666
[x] Local
[x] Auto
Source port: 37123
Destination: localhost:37123
[x] Local
[x] Auto
7. Accedi alla tua macchina Linux con Putty con questo tunnel SSH abilitato.
Lascia aperta la sessione di mastice.
Una volta effettuato l'accesso, Putty eseguirà il tunneling di tutte le connessioni TCP alla macchina Linux sulla porta SSH 22.
JMX-Port:
Windows machine: localhost:15666 >>> SSH >>> linux machine: localhost:15666
RMIServer-Stub-Port:
Windows Machine: localhost:37123 >>> SSH >>> linux machine: localhost:37123
8. Avviare JConsole / Java VisualVM / Java Mission Control per connettersi al proprio processo Java utilizzando il seguente URL
Funziona, perché JConsole / Java VisualVM / Java Mission Control pensa che ti connetti a una porta sulla tua macchina Windows locale. ma Putty invia tutto il payload alla porta 15666 alla tua macchina Linux.
Sulla macchina Linux prima il processo java dà risposta e rimanda la porta RMIServer. In questo esempio 37123.
Quindi JConsole / Java VisualVM / Java Mission Control pensa di connettersi a localhost: 37123 e putty invierà l'intero payload alla macchina Linux
Il processo Java risponde e la connessione è aperta.
[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:<jndi-remote-port>/jmxrmi
Esempio:
[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:15666/jmxrmi
9. GODETEVI # 8-]