Je recherche une solution en ligne de commande qui me renverrait l'adresse IP principale (première) de l'hôte local, autre que 127.0.0.1
La solution devrait fonctionner au moins pour Linux (Debian et RedHat) et OS X 10.7+
Je suis conscient qu'il ifconfig
est disponible sur les deux mais sa sortie n'est pas aussi cohérente entre ces plates-formes.
curl -4 ifconfig.co
. Il répondra avec votre adresse IP4 externe.Réponses:
Utilisez
grep
pour filtrer l'adresse IP deifconfig
:ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'
Ou avec
sed
:ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'
Si vous n'êtes intéressé que par certaines interfaces, wlan0, eth0, etc.:
ifconfig wlan0 | ...
Vous pouvez alias la commande dans votre
.bashrc
pour créer votre propre commande appeléemyip
par exemple.alias myip="ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'"
Une manière beaucoup plus simple est
hostname -I
(hostname -i
pour les anciennes versions dehostname
mais voir les commentaires). Cependant, c'est uniquement sous Linux.la source
-E
option pour Extended RE, pas l'-r
option de style GNU .-E
. Les versions récentes de FreeBSD ont ajouté l'-r
option comme alias pour-E
faciliter la portabilité des scripts, mais la mise à jour n'a pas encore été apportée à OSX, que j'ai vérifié en dernier utilise toujours une version de sed d'une version FreeBSD d'il y a quelques années. Je ne sais pas exactement lequel, car OSX a adopté le code source de FreeBSD à quelques reprises au fil des ans. Je crois que l'utilisation de-E
devait être comparable àgrep
l'-E
option de. Aucune idée pourquoi les gens de GNU ont opté à la-r
place.-E
pour être sûr de la portabilité, vous penseriez que--help
et leman pages
serait mis à jour .. cela m'a causé une légère confusion plus tôt dans une autre question en utilisant-E
Les éléments suivants fonctionneront sous Linux mais pas OSX.
Cela ne repose pas du tout sur DNS, et cela fonctionne même s'il
/etc/hosts
n'est pas défini correctement (1
est un raccourci pour1.0.0.0
):ou en évitant
awk
et en utilisant le DNS public de Google à des8.8.8.8
fins d'évidence:Un moyen moins fiable: (voir commentaire ci-dessous)
la source
hostname -I
n'est pas fiable, car (selon la documentation) on ne peut pas faire d'hypothèses sur l'ordre des adresses. Il peut donc bien s'agir d'un réseau interne (comme le réseau sur lequel vivent les machines virtuelles). L'autre méthode semble bonne.ip route get 1 | awk '{print $(NF-2);exit}'
marche quand j'ajoute uid à la sortieip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'
Pour les machines Linux (pas OS X):
la source
hostname -i
est la forme abrégée équivalentehostname
dans GNU Coreutils version 8.26.hostname -i
ne donne que l'IP locale, tout enhostname -I
donnant toutes les autres IPsous Linux
sur macOS
hostname -I
peut renvoyer plusieurs adresses dans un ordre peu fiable (voir lahostname
page de manuel ), mais pour moi, il revient simplement192.168.1.X
, ce que vous vouliez.la source
hostname -i
avec un I. inférieur-i
drapeau dit ceci:Avoid using this option; use hostname -I instead
.Solution
Explication
La façon correcte d'interroger les informations réseau consiste à utiliser
ip
:-o
sortie sur une ligneroute get to
obtenir la route réelle du noyau vers une destination8.8.8.8
Google IP, mais peut utiliser la véritable IP que vous souhaitez atteindrepar exemple
ip
sortie:Pour extraire l'
src
ip,sed
c'est le plus léger et le plus compatible avec le support regex:-n
pas de sortie par défaut's/pattern/replacement/p'
faire correspondre le motif et le remplacement d'impression uniquement.*src \([0-9.]\+\).*
correspondre à l'IP src utilisée par le noyau, pour atteindre8.8.8.8
par exemple sortie finale:
Autres réponses
Je pense qu'aucune des réponses précédentes n'est assez bonne pour moi, car elles ne fonctionnent pas sur une machine récente (Gentoo 2018).
Problèmes rencontrés avec les réponses précédentes:
ifconfig
est déconseillée et - par exemple - ne répertorie pas plusieurs adresses IP;awk
pour une tâche simple que sed peut mieux gérer;ip route get 1
n'est pas clair, et est en fait un alias pourip route get to 1.0.0.0
hostname
commande, qui n'a pas d'-I
option dans tous les appareils et qui revient127.0.0.1
dans mon cas.la source
Modifié (
2014-06-012018-01-09)Pour une configuration plus solide, avec de nombreuses interfaces et de nombreuses IP configurées sur chaque interface, j'ai écrit un script bash pur (non basé sur
127.0.0.1
) pour trouver une interface et une IP correctes , basées surdefault route
. Je poste ce script tout en bas de cette réponse.Intro
Comme les deux Os l'ont frapper installé par défaut, il existe une astuce bash pour Mac et Linux:
Le problème des paramètres régionaux est évité par l'utilisation de
LANG=C
:Mettre cela dans une fonction:
Minimal:
Utilisation simple:
Rangement de fantaisie:
Usage:
ou, en exécutant la même fonction, mais avec un argument:
Nota: Sans argument, cette fonction sort sur STDOUT, l'IP et une nouvelle ligne , avec un argument, rien n'est imprimé, mais une variable nommée comme argument est créée et contient IP sans nouvelle ligne .
Nota2: Cela a été testé sur Debian, LaCie hacked nas et MaxOs. Si cela ne fonctionne pas dans votre environnement, je serai très intéressé par les retours!
Ancienne version de cette réponse
(Non supprimé car basé sur
sed
, nonbash
.)Avertir: il y a un problème avec les locales!
Rapide et petit:
Explosé (travail aussi;)
Éditer:
Comment! Cela ne semble pas fonctionner sur Mac OS ...
Ok, cela semble fonctionner de la même manière sur Mac OS que sur mon Linux :
divisé:
Mon script (janvier 2018):
Ce script trouvera d'abord votre route et votre interface par défaut utilisées, puis recherchera le réseau local correspondant à l'IP de la passerelle et remplira les variables. Les deux dernières lignes s'impriment, quelque chose comme:
ou
Et bien voilà:
la source
sbin
n'est pas mon$PATH
chemin complet, il faut le spécifier, mais le même chemin existe aussi sur MacOS. :-)time
pour sélectionner lequel vous utiliseriez si longtemps ...Spécifique à certaines versions d'Ubuntu uniquement. Bien que cela puisse simplement vous dire
127.0.0.1
:ou
la source
$ hostname --ip-address
me donne juste127.0.0.1
sur Arch LinuxVous pouvez également obtenir l'adresse IP version 4 de eth0 en utilisant cette commande sous linux
La sortie sera comme ceci
la source
Cela fonctionne sur Linux et OSX
Cela obtiendra l'interface associée à la route par défaut
En utilisant l'interface découverte ci-dessus, obtenez l'adresse IP.
OSX
Darwin laptop 14.4.0 Darwin Kernel Version 14.4.0: Thu May 28 11:35:04 PDT 2015; racine: xnu-2782.30.5 ~ 1 / RELEASE_X86_64 x86_64
en5
192.168.0.130
CentOS Linux
Linux dev-cil.medfx.local 2.6.18-164.el5xen 1 SMP Thu Sep 3 04:03:03 EDT 2009 x86_64 x86_64 x86_64 GNU / Linux
eth0
192.168.46.10
la source
| head -1
à la fin de la première ligne pour obtenir l'interface par défaut, et le reste est bon.Utilisation de certaines des autres méthodes Vous pouvez entrer en conflit où plusieurs adresses IP sont définies sur le système. Cette ligne obtient toujours l'adresse IP utilisée par défaut.
la source
Im extraire mon commentaire à cette réponse:
Il se base sur la réponse @CollinAnderson qui n'a pas fonctionné dans mon cas.
la source
la source
bash
alias:alias myip="ifconfig | grep 'inet ' | grep -v '127.0.0.1' | awk '{print \$2}'"
Le moyen le plus court pour obtenir votre adresse IPv4 locale sur votre système Linux:
la source
En supposant que vous ayez besoin de votre adresse IP publique principale telle qu'elle apparaît dans le reste du monde, essayez l'une d'entre elles:
la source
Je dois ajouter à la réponse de Collin Andersons que cette méthode prend également en compte si vous avez deux interfaces et qu'elles apparaissent toutes les deux.
J'ai travaillé sur une application avec Raspberry Pi et j'avais besoin de l'adresse IP qui était réellement utilisée, pas seulement si elle était active ou non. La plupart des autres réponses renverront les deux adresses IP, ce qui n'est pas nécessairement utile - pour mon scénario de toute façon.
la source
IP d'interface réseau principale
la source
Recherche une adresse IP de cet ordinateur dans un réseau qui est une passerelle par défaut (par exemple exclut tous les réseaux virtuels, les ponts de docker) par exemple. passerelle internet, passerelle wifi, ethernet
Fonctionne sous Linux.
Tester:
la source
la source
Une autre
ifconfig
variante qui fonctionne à la fois sur Linux et OSX:la source
ifconfig | grep '\<inet\>' | cut -d ' ' -f2 | grep -v '127.0.0.1'
J'ai parcouru de nombreux liens (StackExchange, AskUbuntu, StackOverflow, etc.) et j'ai décidé de combiner toutes les meilleures solutions en un seul script shell.
À mon avis, ces deux QA sont les meilleurs qu'on puisse voir:
Comment puis-je obtenir mon adresse IP externe dans un script shell? https://unix.stackexchange.com/q/22615
Comment trouver mon adresse IP interne? https://askubuntu.com/a/604691
Voici ma solution basée sur quelques idées de rsp partagées dans son référentiel ( https://github.com/rsp/scripts/ ).
Certains d'entre vous pourraient dire que ce script est extrêmement énorme pour une tâche aussi simple, mais j'aimerais le rendre aussi simple et flexible que possible. Il prend en charge un fichier de configuration simple permettant de redéfinir les valeurs par défaut.
Il a été testé avec succès sous Cygwin, MINGW et Linux (Red Hat).
Afficher l'adresse IP interne
Afficher l'adresse IP externe
Code source, également disponible par le lien: https://github.com/ildar-shaimordanov/tea-set/blob/master/home/bin/myip . Un exemple de fichier de configuration est là, à côté du script principal.
la source
J'utilise simplement des noms d'interface réseau , ma commande personnalisée est
dans mon propre cahier
mais si l'interface réseau possède au moins une ip, alors elle montrera que toutes les ip lui appartiennent
par exemple
Ubuntu 16.10
Debian Jessie
CentOS 6.8
Fedora 24
Il semble que cette commande
ip route get 1 | awk '{print $NF;exit}'
fournie par le lien soit plus précise, de plus, elle est plus courte.la source
Vous ne savez pas si cela fonctionne dans tous les systèmes d'exploitation, essayez-le.
la source
ip route get 1 | awk '{print $NF;exit}'
. Devrait fonctionner sur la plupart des systèmes.ip route get 1 | awk '{print $NF;exit}'
fonctionneIl y a un package de nœuds pour tout. Il est multiplateforme et facile à utiliser.
C'est une approche controversée, mais l'utilisation de npm pour l'outillage devient de plus en plus populaire, que cela plaise ou non.
la source
Si vous connaissez l'interface réseau (eth0, wlan, tun0 etc.):
la source
la source
la source
Fonctionne sur Mac, Linux et à l'intérieur des conteneurs Docker:
$ hostname --ip-address 2> /dev/null || (ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p' | awk '{print
1 $; sortie}')Fonctionne également en
Makefile
tant que:LOCAL_HOST := ${shell hostname --ip-address 2> /dev/null || (ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p' | awk '{print $1; exit}')}
la source
hostname --ip-address
=>hostname: illegal option -- -
sur macOS SierraPour linux, vous avez besoin de cette commande:
tapez ceci dans votre shell et vous connaîtrez simplement votre ip.
la source
C'est plus facile à lire:
ifconfig | grep 'inet addr:' |/usr/bin/awk '{print $2}' | tr -d addr:
la source
Si vous avez
npm
etnode
installé:npm install -g ip && node -e "const ip = require('ip'); console.log(ip.address())"
la source