Cara menggunakan ifconfig untuk hanya menampilkan antarmuka aktif

22

Secara default ifconfigakan menunjukkan semua antarmuka yang tersedia, tetapi bagaimana jika saya hanya ingin menampilkannya active? Seperti, en0hanya di bawah.

en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether 14:10:9f:e0:eb:c9 
    inet6 fe80::1610:9fff:fee0:ebc9%en0 prefixlen 64 scopeid 0x4 
    inet X.X.X.X netmask 0xffffff00 broadcast 101.6.69.255
    nd6 options=1<PERFORMNUD>
    media: autoselect
    **status: active**
en3: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
    options=60<TSO4,TSO6>
    ether 32:00:14:e7:4f:80 
    media: autoselect <full-duplex>
    **status: inactive**

Pemberitahuan ifconfig en0tidak akan memuaskan, en0tidak selalu yang aktif;)

Saya menjalankan Mac OS X.

qweruiop
sumber
2
OS Anda akan menjadi sesuatu yang penting untuk disebutkan karena ifconfigimplementasinya bervariasi. Juga, mengapa penggunaan ifconfigmerupakan persyaratan? Apa tujuan akhir Anda?
jordanm
Hai @jordanm, tujuan saya adalah untuk mendapatkan alamat IP dari antarmuka yang aktif saat ini, seringkali antarmuka Ethernet nirkabel atau kabel.
qweruiop
bagaimana Anda mendefinisikan antarmuka aktif?
AnonymousLurker

Jawaban:

24

Untuk mendapatkan deskripsi lengkap tentang semua layanan aktif, coba:

ifconfig | pcregrep -M -o '^[^\t:]+:([^\n]|\n\t)*status: active'

Regex sederhana ini hanya akan memfilter antarmuka aktif dan semua informasinya. Saya sarankan Anda meletakkan alias untuk ini di file ~ / .profile atau ~ / .bash_profile Anda (mungkin ifactive?)

Untuk mendapatkan nama antarmuka (berguna untuk skrip), gunakan:

ifconfig | pcregrep -M -o '^[^\t:]+:([^\n]|\n\t)*status: active' | egrep -o -m 1 '^[^\t:]+'

Anda harus menginstal pcregrep agar ini berfungsi. Ada di macports dalam paket pcre. Atau, ini harus bekerja dengan GNU grep menggunakan grep -Pzobukan pcregrep -M -otetapi dengan sisanya sama, tapi saya belum menguji ini.

g.jaket
sumber
2

Jika Anda hanya ingin mencetak "entri" jika berisi status: active, maka Anda dapat menggunakan sesuatu seperti program awk ini sebagai filter ke keluaran ifconfig :

#!/usr/bin/awk -f
BEGIN            { print_it = 0 }
/status: active/ { print_it = 1 }
/^($|[^\t])/     { if(print_it) print buffer; buffer = $0; print_it = 0 }
/^\t/            { buffer = buffer "\n" $0 }
END              { if(print_it) print buffer }

Ketika setiap "entri" dimulai (baris kosong atau tidak dimulai dengan Tab), mulai menyimpan entri dalam buffer. Tambahkan ke buffer ini setiap baris berikutnya yang dimulai dengan Tab. Perhatikan string ajaib status: active; jika garis seperti itu terlihat, cetak buffer ("entri" sebelumnya) ketika "entri" baru dimulai (atau input berakhir).

Simpan teks program di atas dalam file dan gunakan seperti ini:

ifconfig -a | awk -f /path/to/file

Atau, jika Anda chmod +xfile, maka Anda dapat menyederhanakannya sedikit:

ifconfig -a | /path/to/file
Chris Johnsen
sumber
2

Jika Anda tidak menentang beberapa skrip bash, Anda dapat melakukan ini:

for i in $(ifconfig -lu); do if ifconfig $i | grep -q "status: active" ; then echo $i; fi; done

Itu akan menampilkan antarmuka jaringan yang aktif. Diuji pada Mac OS X 10.13.

Yang menyenangkan adalah Anda tidak perlu menginstal apa pun. Jalankan saja di atas dalam Terminal.

Claudio
sumber
Ini harus menjadi jawaban terbaik, namun ifconfig -lutidak akan bekerja pada debian. Tetapi OP menggunakan MacOS, jadi solusi ini akan bekerja pada sistem dengan BSD ifconfig. Saya memposting jawaban lain di bawah ini yang melakukan hal yang sama tanpa menggunakanifconfig -lu
Rakib Fiha
1

Membaca komentar dan pertanyaan Anda, sepertinya Anda benar-benar hanya ingin mendapatkan antarmuka yang memiliki alamat IP yang ditugaskan untuk mereka.

Anda dapat melakukan ini dengan cepat dengan ifconfigdan grep.

Menjalankan perintah:

ifconfig | grep 'Link\|inet'

Harus menghasilkan sesuatu yang mirip dengan:

eth0 Link encap: Ethernet HWaddr 00: 11: 22: 33: 44: 55
eth1 Link encap: Ethernet HWaddr 00: 11: 22: 33: 44: 66  
          inet addr: 192.168.0.8 Bcast: 192.168.0.255 Topeng: 255.255.255.0
lo Link encap: Local Loopback  
          inet addr: 127.0.0.1 Mask: 255.0.0.0

Ini akan menunjukkan setiap baris dengan nama antarmuka dan dan IP jika ada.

Beberapa sihir REGEX yang lebih spesifik mungkin memberi Anda apa yang Anda butuhkan.

Nathan McCoy
sumber
2
Terima kasih tetapi di mana activepertimbangannya?
qweruiop
jika ada baris setelah antarmuka, maka ia memiliki alamat IP yang ditetapkan untuknya, dan maksud saya, Anda akan menyebutnya 'aktif'.
Nathan McCoy
1

Saya berharap pertanyaannya sedikit lebih jelas. Dengan anggapan bahwa Active interface only, Anda bermaksud menunjukkan nama antarmuka aktif saja (Dalam kasus UPdan RUNNINGstatus saya active) tanpa detail lainnya. Kemudian coba ini:

ifconfig | \
  grep "UP\|RUNNIG" \
  | awk '{print $1}' \
  | grep ':' \
  | tr -d ':' \
  | grep -v lo

Outputnya akan terlihat seperti:

en0
en1
en2
bridge0
p2p0
awdl0
llw0
utun0
utun1
utun2
utun3
en6

Sesuaikan grep -vbidang dan tambahkan lebih banyak antarmuka yang tidak diinginkan seperti loopback-> lodll, jika perlu.

Sekarang, jika Anda mau dan Anda perlu memeriksa apakah antarmuka yang ditemukan aktif saat ini. Maka kita bisa dengan mudah mengirimkannya sebagai argumen untuk ifconfig <interface>seperti yang ditunjukkan di bawah ini:

[[ $(ifconfig en0 | grep -w active) ]] && echo "en0 is active"

Menyederhanakan ini lebih lanjut dan mengimplementasikannya dalam suatu fungsi:

checkActiveInterfaces()
{
  local intARR=( $(ifconfig | \
      grep "UP\|RUNNIG" \
      | awk '{print $1}' \
      | grep ':' \
      | tr -d ':' \
      | grep -v lo) );
    intARR=( $(printf "%s\n" "${intARR[@]}" | sort -u) );
    for i in "${intARR[@]}"; do
      [[ $(ifconfig $i | grep -w active) ]] && {
       echo "$i"
    }
    done
}

Menjalankan fungsi ini hanya akan mengembalikan antarmuka yang aktif. Dalam kasus saya:

awdl0
en0
llw0
Rakib Fiha
sumber
0

Mengikuti akan mencetak hanya antarmuka yang dikonfigurasikan untuk memiliki IP

ifconfig | grep "inet.*broadcast"
Yousif Atique
sumber
0

Dapatkan antarmuka MAC ACTIVE saja:

cat /sys/class/net/$(ip addr | awk '/state UP/ {print $2}' | sed 's/.$//')/address
Alex P
sumber
Perhatikan bahwa MacOS tidak memiliki ipsecara default; Anda perlu HomeBrew untuk itu, lalu jalankan brew install iproute2macsekali. Kode sumbernya ada
Jeroen Wiert Pluimers
-1
$ ifconfig | grep "inet addr:" | grep -v 127.0.0.1 | sed -e 's/Bcast//' | cut -d: -f2

Bagaimana itu bekerja:

  • ifconfig
  • Grep untuk baris yang mengandung "inet addr"
    • Baris-baris ini berisi IP.
  • Grep untuk baris yang tidak mengandung "127.0.0.1"
    • Kami biasanya tidak peduli dengan localhost.
    • -v adalah grep terbalik
  • Dari baris yang tersisa, hapus "Bcast"
  • Potong bidang 2 menggunakan ":" sebagai pembatas
    • Mencetak jawabannya.
ohlemacher
sumber
-1
ifconfig en0 | grep status

Ini akan menunjukkan status koneksi ethernet en0

swartenfagen
sumber