web-dev-qa-db-ja.com

宛先を指定して、LINUXでデフォルトゲートウェイを取得するにはどうすればよいですか?

宛先0.0.0.0を使用して、デフォルトゲートウェイを取得しようとしています

次のコマンドを使用しました:netstat -rn | grep 0.0.0.0

そして、このリストを返しました:

**Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface<br>
10.9.9.17       0.0.0.0         255.255.255.255 UH        0 0          0 tun0<br>
133.88.0.0      0.0.0.0         255.255.0.0     U         0 0          0 eth0<br>
0.0.0.0         133.88.31.70    0.0.0.0         UG        0 0          0 eth0**<br>

ここでの私の目標は、宛先0.0.0.0;を使用してデフォルトゲートウェイをpingすることです。したがって、それは133.88.31.70です。しかし、これはgrepを使用しているためリストを返します。

デフォルトゲートウェイのみを取得するにはどうすればよいですか?ネット接続がアップしているかどうかを識別するために、bashスクリプトで必要になります。

34
Suezy

次のようなipコマンドを使用して、デフォルトゲートウェイを取得できます。

IP=$(/sbin/ip route | awk '/default/ { print $3 }')
echo $IP
53
Ali Mezgani

ip routeiproute2 パッケージのコマンドは、選択を行うためにawk/grepなどを使用する必要なしにルートを選択できます。

デフォルトルートを選択するには(多くの場合)

$ ip -4 route list 0/0   # use -6 instead of -4 for ipv6 selection.
default via 172.28.206.254 dev wlan0  proto static

特定のインターフェイスの次のホップを選択するには

$ ip -4 route list type unicast dev eth0 exact 0/0  # Exact specificity
default via 172.29.19.1 dev eth0

複数のデフォルトゲートウェイの場合、特定の宛先アドレスへのネクストホップとして選択されるデフォルトゲートウェイを選択できます。

$ ip route get $(Dig +short google.com | tail -1)
173.194.34.134 via 172.28.206.254 dev wlan0  src 172.28.206.66 
    cache

その後、sed/awk/grepなどを使用して値を抽出できます。以下は、bashreadビルトインを使用した1つの例です。

$ read _ _ gateway _ < <(ip route list match 0/0); echo "$gateway"
172.28.206.254
36
shalomb

すべてのLinuxで動作します:

route -n|grep "UG"|grep -v "UGH"|cut -f 10 -d " "
6
damix

このシンプルなPerlスクリプトはあなたのためにそれを行います。

#!/usr/bin/Perl

$ns = `netstat -nr`;

$ns =~ m/0.0.0.0\s+([0-9]+.[0-9]+.[0-9]+.[0-9]+)/g;

print $1

基本的に、netstatを実行し、$ nsに保存します。次に、0.0.0.0で始まる行を見つけます。次に、正規表現内の括弧は、その中のすべてを$ 1に保存します。その後、単にそれを印刷します。

Null-gw.plと呼ばれる場合は、次のようにコマンドで実行します。

Perl null-gw.pl

または、bash式内で必要な場合:

echo $(Perl null-gw.pl)

幸運を。

4
Jeremy Powell

これは私がそれを行う方法です:

#!/bin/sh
GATEWAY_DEFAULT=$(ip route list | sed -n -e "s/^default.*[[:space:]]\([[:digit:]]\+\.[[:digit:]]\+\.[[:digit:]]\+\.[[:digit:]]\+\).*/\1/p")
echo ${GATEWAY_DEFAULT}
3
Noah Spurrier

別のPerlのこと:

$return = (split(" ", `ip route | grep default`))[2];<br>

注:ipの前とdefaultの後にこれらのバックティックを使用します

1
somone

netstat -rn | grep 0.0.0.0 | awk '{print $ 2}' | grep -v "0.0.0.0"

1
Linx

allデフォルトゲートウェイのリストについては、 mezgani's answer を使用します。

/sbin/ip route | awk '/^default/ { print $3 }'

複数のネットワークインターフェイスが同時に設定されている場合、これにより複数のゲートウェイが出力されます。名前で単一の既知のネットワークインターフェイスを選択する場合(例:eth1)、単純にに加えて、^default行:

/sbin/ip route |grep '^default' | awk '/eth1/ {print $3}'

単一のネットワークインターフェイス名を引数として受け取り、関連するゲートウェイを出力するスクリプトを作成できます。

#!/bin/bash
if [[ $# -ne 1 ]]; then
    echo "ERROR: must specify network interface name!" >&2
    exit 1
fi
# The third argument of the 'default' line associated with the specified
# network interface is the Gateway.
# By default, awk does not set the exit-code to a nonzero status if a
# specified search string is not found, so we must do so manually.
/sbin/ip route | grep '^default' | awk "/$1/ {print \$3; found=1} END{exit !found}"

コメントで述べたように、これには賢明な終了コードを設定するという利点があります。これは、より広範なプログラムのコンテキストで役立つ場合があります。

1
Kyle Strand
#!/bin/bash

##################################################################3
# Alex Lucard
# June 13 2013
#
# Get the gateway IP address from the router and store it in the variable $gatewayIP
# Get the Router mac address and store it in the variable gatewayRouter
# Store your routers mac address in the variable homeRouterMacAddress
#

# If you need the gateway IP uncomment the next line to get the gateway address and store it in the variable gateWayIP
# gatewayIP=`Sudo route -n | awk '/^0.0.0.0/ {print $2}'` 

homeRouterMacAddress="20:aa:4b:8d:cb:7e" # Store my home routers mac address in homeRouterMac.
gatewayRouter=`/usr/sbin/arp -a`

# This if statement will search your gateway router for the mac address you have in the variable homeRouterMacAddress
if `echo ${gatewayRouter} | grep "${homeRouterMacAddress}" 1>/dev/null 2>&1`
then
  echo "You are home"
else
  echo "You are away"
fi
1
Alex Lucard

ここにはすでに多くの答えがあります。これらのいくつかはかなり特定のディストリビューションです。この投稿を見つけてゲートウェイを見つける方法を探しているが、コード/バッチの使用にゲートウェイを使用する必要がない人のために(私がしたように)...試してみてください:

traceroute www.google.com

最初のホップはデフォルトゲートウェイです。

1
blueflyingdago

/ sbin/route | egrep "^ default" | cut -d '' -f2-12 #and 'cut' to taste ...

0
Chuck

0.0.0.0が予想される出力であり、行の先頭にあることがわかっている場合は、スクリプトで次を使用できます。

IP=`netstat -rn | grep -e '^0\.0\.0\.0' | cut -d' ' -f2`

次に、変数${IP}を参照します。

ここでカットする代わりにawkを使用した方が良いでしょう...つまり:

IP=`netstat -rn | grep -e '^0\.0\.0\.0' | awk '{print $2}'`
0
maxwellb

以下のコマンドを使用します。

route -n | grep '^0\.0\.\0\.0[ \t]\+[1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*[ \t]\+0\.0\.0\.0[ \t]\+[^ \t]*G[^ \t]*[ \t]' | awk '{print $2}'
0
Jason

次のコマンドは、bashとawkのみを使用して、Linuxホスト上のデフォルトルートゲートウェイIPを返します。

printf "%d.%d.%d.%d" $(awk '$2 == 00000000 && $7 == 00000000 { for (i = 8; i >= 2; i=i-2) { print "0x" substr($3, i-1, 2) } }' /proc/net/route)

複数のデフォルトゲートウェイがある場合でも、それらのメトリックが異なる限り(そして、あるべきです)、これは機能するはずです。

0