Ağ maskemi Linux'ta almak istiyorum. İle çıktı ifconfig
ama ben dize ayıklamak istiyorum.
Ağ maskemi Linux'ta almak istiyorum. İle çıktı ifconfig
ama ben dize ayıklamak istiyorum.
Yanıtlar:
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
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:
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ı
/sbin/ifconfig eth0 | awk '/Mask:/{ print $4;} '
?
/sbin/ifconfig eth0 | awk -F: '/Mask:/{print $4}'
/sbin/ifconfig eth0 | awk '/netmask/{print $4}'
Gerçekten sadece maskeyi isteyip istemediğinizi merak ediyorum. Belki maskeli ağın (veya IP'nin), yapılandırma dosyalarında nmap
veya 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.
ip -o -f inet addr show scope global
ve ip route list default
.
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"
/sbin/ifconfig eth0 | grep Mask | cut -d":" -f4
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
. -o
Böylece grep
hat 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.
/sbin/ifconfig | grep ask | sed -e 's/.*netmask //g' | sed -e 's/ .*//g'
maskeyi onaltılık çıktı olarak alıyorum .
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ı.
grep 'pattern' | awk '{ action }'
genellikle azaltılabilirawk '/pattern/ { action }'
ifconfig
netmask hattı şöyledir:inet 192.168.144.120 netmask 0xffffff00 broadcast 192.168.144.255
bu nedenle cevaplar kolayca ayarlanabilirken, muhtemelen tek bedene uyan hiçbir şey yoktur (sadece Bash / ifconfig kullanarak) .