Comment get ma propre adresse IP et l'save dans une variable dans un script shell?

Comment puis-je get ma propre adresse IP et l'save dans une variable dans un script shell?

    Ce n'est pas si facile si vous voulez prendre en count wlan et d'autres interfaces alternatives. Si vous connaissez l'interface pour laquelle vous souhaitez utiliser l'adresse (par exemple eth0, la première carte Ethernet), vous pouvez utiliser ceci:

    ip="$(ifconfig | grep -A 1 'eth0' | tail -1 | cut -d ':' -f 2 | cut -d ' ' -f 1)" 

    En d'autres termes, obtenez-moi les informations de configuration du réseau, searchz eth0 , obtenez cette ligne et la suivante ( -A 1 ), obtenez seulement la dernière ligne, récupérez la deuxième partie de cette ligne en splitting avec : une partie de cela lors de la séparation avec l'espace.

    Je crois que le moyen «d'outils modernes» pour get votre adresse ipv4 est d'parsingr «ip» plutôt que «ifconfig», donc ce serait quelque chose comme:

     ip=$(/sbin/ip -o -4 addr list eth0 | awk '{print $4}' | cut -d/ -f1) 

    ou quelque chose comme ça.

    Pourquoi ne pas simplement faire IP=$(hostname -I) ?

    Si vous voulez l'adresse d'une interface, le plus simple est d'installer moreutils puis:

     anthony@Zia:~$ ifdata -pa br0 172.16.1.244 

    ifdata répond à peu près toutes les questions auxquelles vous seriez tenté d'parsingr la sortie ifconfig .

    Si vous voulez connaître votre adresse IP comme l'extérieur le voit (au-delà de tout NAT, etc.), il y a beaucoup de services qui le feront. L'un est assez facile:

     anthony@Zia:~$ curl ifconfig.me 173.167.51.137 

    Pour get les adresses IPv4 et IPv6, et ne pas supposer que l'interface principale est eth0 (ces jours em1 est plus commun ), essayez:

     ips=$(ip -o addr show up primary scope global | while read -r num dev fam addr rest; do echo ${addr%/*}; done) 
    • -o utilise le format de sortie à une ligne, ce qui est plus facile à traiter avec read , grep , etc.
    • up exclut les appareils qui ne sont pas actifs
    • scope global exclut les adresses privées / locales telles que 127.0.0.1 et fe80::/64
    • primary exclut les adresses temporaires (en supposant que vous voulez une adresse qui ne change pas)
     ipa=$(ip route get 8.8.8.8| grep src| sed 's/.*src \(.*\)$/\1/g') ipa=$(hostname -i|cut -f2 -d ' ') 

    Cela dépend de ce que vous voulez dire par votre propre adresse IP. Les systèmes ont des adresses IP sur plusieurs sous-réseaux (parfois plusieurs par sous-réseau) dont certains IPv4, certains IPv6 utilisant des adaptateurs Ethernet, des interfaces de bouclage, des tunnels VPN, des ponts, des interfaces virtuelles …

    Je veux dire l'adresse IP par laquelle un autre périphérique peut atteindre votre ordinateur, vous devez savoir quel sous-réseau et quelle version d'IP nous parlons. Gardez également à l'esprit que l'adresse IP d'une interface peut ne pas être la même que celle d'un hôte distant qui voit une connection entrante provenant de votre ordinateur à cause du NAT exécuté par le pare-feu / les routeurs.

    Lorsqu'il y a un routing de source de fantaisie ou un routing par protocole / port, il peut être difficile de savoir quelle interface serait utilisée pour parler à un ordinateur distant sur un protocole donné et même alors, il n'y a aucune garantie que l'adresse IP de cette interface puisse être directement adressable par l'ordinateur distant désireux d'établir une nouvelle connection à votre ordinateur.

    Pour IPv4 (fonctionne probablement pour IPv6 également), une astuce qui fonctionne dans beaucoup d'unices incluant Linux pour find l'adresse IP de l'interface utilisée pour atteindre un hôte donné est d'utiliser un connect (2) sur un socket UDP et d'utiliser getsockname ():

    Par exemple, sur mon ordinateur personnel:

     perl -MSocket -le 'socket(S, PF_INET, SOCK_DGRAM, getprotobyname("udp")); connect(S, sockaddr_in(1, inet_aton("8.8.8.8"))); print inet_ntoa((sockaddr_in(getsockname(S)))[1]);' 

    Serait utilisé pour find l'adresse IP de l'interface via laquelle je voudrais atteindre 8.8.8.8 (server DNS de Google). Il returnnerait quelque chose comme "192.168.1.123" qui est l'adresse de l'interface pour la route par défaut vers internet. Cependant, Google ne verrait pas une requête DNS de ma machine provenant de cette adresse IP qui est privée, car il y a NAT exécuté par mon routeur haut débit domestique.

    connect () sur un socket UDP n'envoie aucun package (UDP est sans connection), mais prépare le socket en interrogeant la table de routing.

    J'utilise ce one-liner:

     IP=$(/sbin/ifconfig | grep -e "inet:" -e "addr:" | grep -v "inet6" | grep -v "127.0.0.1" | head -n 1 | awk '{print $2}' | cut -c6-) 

    Utilise ifconfig (largement disponible), ne prend pas l'adresse localhost , ne vous lie pas à un nom d'interface donné, ne prend pas en count IPv6 et tente d'get l'adresse IP de la première interface réseau disponible.

    Sur FreeBSD, vous pouvez utiliser

     dig +short `hostname -f` 

    Cela peut fonctionner pour d'autres environnements, dépend de votre configuration.

    En supposant que vous pouvez avoir différentes interfaces de nom différent mais que vous voulez le premier non-localhost et non-ipv6, vous pouvez essayer:

     ip=`ip addr show |grep "inet " |grep -v 127.0.0. |head -1|cut -d" " -f6|cut -d/ -f1` 

    Je devais le faire dans un alias pour démarrer un server radio sur mon NIC filaire. j'ai utilisé

     ip addr | egrep -i "inet.+eth1" | awk -F[\ /] '{print $6}' | tr -d [:space:] 

    Certaines commands fonctionnent sur les centos 6 ou 7, la command ci-dessous fonctionne sur les deux,

     #!/bin/sh serverip=`/sbin/ifconfig eth0 | grep "inet" | awk '{print $2}' | awk 'NR==1' | cut -d':' -f2` echo $serverip 

    En supposant que vous ayez besoin de votre PI publique primaire telle qu'elle a été vue du rest du monde , essayez l'une des solutions suivantes:

     wget http://ipecho.net/plain -O - -q curl http://icanhazip.com curl http://ifconfig.me/ip 

    Cet extrait évite de coder en dur le nom du périphérique (comme 'eth0') et utilisera ip au lieu de ifconfig :

     /sbin/ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d'/' 

    Il returnnera l'IP du premier périphérique actif listé dans la sortie de l' ip addr . Selon votre machine, cela peut être une adresse ipv4 ou ipv6.

    Pour le stocker dans une variable, utilisez:

     ip=$(/sbin/ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d'/') 
     myip=$(curl -kLs "http://api.ipify.org") 

    ou

     myip=$(wget -q "http://api.ipify.org" -O -) 

    toutes les solutions utilisant awk / sed / grep me paraissent trop complexes et laides pour ma situation … alors j'ai proposé cette solution vraiment simple MAIS méfiez-vous cus il fait quelques hypothèses, à savoir l'hypothèse que la dernière interface est celle que vous êtes intéressé. si vous êtes d'accord avec cela, c'est assez propre:

    ifconfig | awk '/net / { x = $2 } END { print x }'

    Sinon, vous pourriez faire des bêtises if souhaitez tester un préfixe spécifique ou tout autre critère que vous pourriez avoir.

     hostname -I >> file_name 

    cela fera tout ce que vous voulez