Bash'den netmask nasıl alınır?


8

Ağ maskemi Linux'ta almak istiyorum. İle çıktı ifconfigama ben dize ayıklamak istiyorum.


5
Aslında bu soru zordur, eğer işletim sisteminizi belirtmezseniz, örneğin, FreeBSD'nin ifconfignetmask hattı şöyledir: inet 192.168.144.120 netmask 0xffffff00 broadcast 192.168.144.255bu nedenle cevaplar kolayca ayarlanabilirken, muhtemelen tek bedene uyan hiçbir şey yoktur (sadece Bash / ifconfig kullanarak) .
sr_

Yanıtlar:


8

Buradaki kodun Linux için çalıştığını açıklığa kavuşturmalıyım (diğer Unices hakkında yorumları not edin ve gönderin). OP bir Linux çözümü istedi, ancak soruyu genel olarak "netmask nasıl elde edilir" olarak değiştirmek ve cevabın daha fazla Unix aroması için en iyi yolu birleştirmesini sağlamak iyi olurdu.

#!/bin/sh
ifconfig "$1" | sed -rn '2s/ .*:(.*)$/\1/p'

./script eth0

Linux'ta ifconfig hakkında

Netstat, arp, rarp ve route gibi diğer geleneksel ağ komutlarıyla birlikte, ifconfig net-tools paketinin bir parçasıdır . Net-tools uzun zamandır aktif olarak geliştirilmemiştir ve yeni iproute2 paketi lehine kullanımdan kaldırılmaya çalışılmaktadır . Kısacası, bu temel geçiş hakkında daha fazla ayrıntı istiyorsanız, aşağıda bazı ilgili bağlantılar verilmiştir:

Örnek olay: Debian Linux

Örnek olay örneği: Arch Linux

Net-tools ifconfig için kılavuz sayfası (HATA bölümüne bakın)

Kullanıcı perspektifinden çerçevelerin analizi ve karşılaştırılması


Söz konusu arayüzde netmask yoksa bu çözüm '1' değerini döndürür. Normal ifade, güvenilir / güvenli hale getirmek için çok önemli 'Maske' kelimesine uygun bir çapa ihtiyacı da dahil olmak üzere ciddi bir yeniden işleme ihtiyaç duyuyor.
Oliver Dungey

7
/sbin/ifconfig eth0 | awk '/Mask:/{ print $4;} '

?


Kayıp | cut -c6- "Maske:" yi kaldırmak için
michelemarcon

3
Awk alan ayırıcısının belirtilmesi de "Maske:" nin kaldırılması için çalışır:/sbin/ifconfig eth0 | awk -F: '/Mask:/{print $4}'
Shane

Debian Stretch / net-tools 2.10-alfa'da bunu değiştirmek zorunda kaldım:/sbin/ifconfig eth0 | awk '/netmask/{print $4}'
Shane

7

Gerçekten sadece maskeyi isteyip istemediğinizi merak ediyorum. Belki maskeli ağın (veya IP'nin), yapılandırma dosyalarında nmapveya herhangi bir şekilde kullanılmasını istersiniz .

Bu durumda, Linux'ta ip ...komutun çıktısını da ayrıştırabilirsiniz .

CIDR gösterimlerinde adresleri ve maskeleriyle tüm arabirimleri listelemek için:

ip -o -f inet addr show | awk '/scope global/ {print $2, $4}'

Veya varsayılan arayüzle kısıtlamak için:

default_if=$(ip route list | awk '/^default/ {print $5}')
ip -o -f inet addr show $default_if | awk '{print $4}'

bu da bana makinemde "192.168.1.61/24" veriyor.


2
... 'kapsam küresel' veya 'varsayılan' ile yapabileceğiniz gibi gerçekten gerekli değildir ip -o -f inet addr show scope globalve ip route list default.
bryn

3

maskeyi onaltılık çıktı veren bir işletim sistemi kullanıyorsanız, aşağıdakine benzer bir şey yapabilirsiniz:

#!/usr/bin/bash

# read the mask, and strip leading 0x if it's there
hexmask=$( echo $1 | sed -e 's/^0x//' )

# loop through $hexmask in pairs
#
for (( i=0; i<${#hexmask}; i+=2 )); do
        if (( $i > 1 )); then
                # use a . to separate octets
                # but don't print a leading .
                printf "%s" "."
        fi
        printf "%d" "0x${1:$i:2}"
done

printf "\n"

2
/sbin/ifconfig eth0 | grep Mask | cut -d":" -f4

Gerisi awk, gerçek hayatta durum böyle olmayan sabit sayıda sütuna bağlı olduğu sürece bu en iyi cevaptır ifconfig. Gerçi birkaç değişiklik öneririm: ifconfig eth0 | grep -o 'Mask:[^\s]*' | cut -d':' -f2. -oBöylece grephat yerine, sürü (daha verimli) sadece döner parça. [^\s]*Ağ maskesi belirtecinin sonunu bulmak için boşluk olmayan karakterleri ( ) eşleştirin. Güvenlik için alan sınırlayıcı etrafında tek tırnak.
Oliver Dungey

macOS'ta /sbin/ifconfig | grep ask | sed -e 's/.*netmask //g' | sed -e 's/ .*//g'maskeyi onaltılık çıktı olarak alıyorum .
Tomachi

1

Varsayılan ağ aygıtı için ağ maskesini arıyorsanız, varsayılan aygıt eth0 olmayabilir, bu komut varsayılan aygıtı döndürür

netdevice=$(ip r | grep default | awk '/default/ {print $5}')

Ve bu komut maskeyi alır:

netmask=$(ifconfig "$netdevice" | awk '/netmask/{ print $4;}')

Cevabı hem basitleştirmeme hem de netleştirmeme yardımcı olan Eliah Kagan ve Paulo Tome sayesinde. Kişisel makinemde varsayılan ethernet cihazı, "wlx504654c1a91" idi ve bu, iki adımlı işlemin hatırlanması ve doğru şekilde yazılması çok karmaşıktı.


1
grep 'pattern' | awk '{ action }'genellikle azaltılabilirawk '/pattern/ { action }'
roaima
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.