una saber que por para nombre internet equipo direccion como comando java linux spring java-8 hostname

java - que - saber el hostname de una ip linux



En Java 8, ¿cómo obtengo mi nombre de host sin codificarlo en mi entorno? (9)

Acabamos de actualizar a Java 8 en Amazon Linux. Estamos utilizando Spring 4.3.8.RELEASE. Solía ​​ser que pudiéramos obtener nuestro nombre de host de la máquina configurando beans en el archivo de contexto de nuestra aplicación como ...

<bean id="localhostInetAddress" class="java.net.InetAddress" factory-method="getLocalHost" /> <bean id="hostname" factory-bean="localhostInetAddress" factory-method="getHostName" />

Pero con Java 8, el bean "nombre de host" ahora contiene la cadena

localhost

Antes de Java 8, solía contener el valor de "nombre de host" tal como se ejecuta en la línea de comando, que es

[myuser@machine1 ~]$ hostname machine1.mydomain.org

¿Cómo puedo reconfigurar nuestro bean para que obtenga el nombre de host que la línea de comandos enumera? No quiero codificar nada en ningún lado.


Alternativamente, puede ejecutar el comando hostname linux usando Java Runtime, el código debería ser algo como a continuación:

String cmdResult=""; Runtime r = Runtime.getRuntime(); Process p = r.exec("hostname"); BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); String inputLine; while ((inputLine = in.readLine()) != null) { cmdResult += inputLine; } in.close();


Creo que Java todavía llama al nombre nativo gethostname() , pero no podría decir por qué falla esto.

Para Linux, puedes probar esta alternativa:

String hostname = new String(Files.readAllBytes(Paths.get("/proc/sys/kernel/hostname")), StandardCharsets.US_ASCII);


De InetAddress java 8 no está obteniendo el nombre de host :

Hubo un error similar disparado en JDK.

Lo que entiendo es que cambiaron el proceso de resolución predeterminado.

Cumplen con la configuración en /etc/nsswitch.conf donde los hosts están configurados para / etc / hosts, lo que le da la prioridad principal para la resolución de nombres.

Normalmente, / etc / hosts tiene un registro para 127.0.0.1 localhost que proporciona el nombre para el host localhost


Hay una pregunta similar en los errores de OpenJDK

Las llamadas más recientes respetan los archivos de configuración localetts /etc/nsswitch.conf. En el caso de esta máquina, ese archivo le dice a estas llamadas que busquen en los archivos antes de hacer referencia a otros servicios de nombres.

Dado que el archivo / etc / hosts contiene una asignación explícita para esta combinación de nombre de host / IP, eso es lo que se devuelve.

En los JDK anteriores, gethostbyname en realidad ignoró la configuración de las máquinas locales y se delegó inmediatamente en el servicio de nombres.

Siempre puedes usar la clase Runtime para eso:

Process hostname = Runtime.getRuntime().exec("hostname"); BufferedReader stdInput = new BufferedReader(new InputStreamReader(hostname.getInputStream())); String s; while ((s = stdInput.readLine()) != null) { System.out.println(s); }

Pero no es tan recomendable como se puede see


InetAddress en Java 8 tenía un error con respecto a la resolución del nombre de host. El error se informó en la versión 8u20 y se ha corregido desde entonces. Por favor, compruebe que no está en esta versión. Si no, utilice InetAddress.getLocalHost().getHostName() le dará el nombre de host.

También sugiero, configurar un nombre de host estático en la instancia de AWS.

  1. Actualizar / etc / hosts
  2. Actualizar / etc / nombre de host
  3. Ejecutar hostname de hostname para comprobar el nombre de host
  4. Reinicie y verifique el nombre de host persistido

Esto debería permitirle leer el nombre de host del archivo si es necesario.

Además, si el comando hostname da el resultado correcto, entonces use el método exec en la clase Runtime para ejecutar el comando y leer el InputStream para obtener la respuesta.

PD: puede usar InetAddress.getLocalHost().isLoopbackAddress() para verificar si la dirección es una LoopbackAddress y luego usar un método de reserva.


Puede probar InetAddress.getCanonicalHostName()

Los JavaDocs para getCanonicalHostName () dicen

Obtiene el nombre de dominio completo para esta dirección IP. Método de mejor esfuerzo, lo que significa que es posible que no podamos devolver el FQDN según la configuración del sistema subyacente.


Puedo ser mejor definir una propiedad en su archivo .properties para el nombre de host como.

hostname=myserver.mydomain.com

Y utilízalo en tu aplicación. De esta manera no está harcoded. También evita la dependencia de la configuración del sistema operativo que se puede cambiar sin atención.


Realmente tiene tres opciones de diferente complejidad y valor de información:

  1. En realidad, ejecute el comando hostname usando Runtime . Es bastante portátil y debería funcionar prácticamente en todas partes. (Tal vez no en los mainframes de IBM)
  2. Toma todas las interfaces de red disponibles y obtén sus nombres de host. https://docs.oracle.com/javase/tutorial/networking/nifs/listing.html
  3. Establecer un entorno o propiedad del sistema como el valor del nombre de host .
    Como java -Dmy.hostname = hostname ...

Lo triste es que no es tan sencillo en Spring XML.

Todas las demás opciones son conocidas por dar diferentes grados de precisión. Como 127.0.0.1 probablemente se resolverá en localhost o localhost.localdomain .


Ya que mi comentario se perdió en la transmisión, por favor intente

<bean id="hostname" class="com.amazonaws.util.EC2MetadataUtils" factory-method="getLocalHostName()">

Eche un vistazo a la documentación de Amazon si el resultado no se adapta a sus necesidades.