2009-07-30 14 views
29

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

を使用して、デフォルトゲートウェイを取得しようとしている私は、このコマンドを使用: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> 

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

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

+0

hmm ...サーバー障害の質問? sed/awkそれ。 (私は本当にsed/awk?* shudder *を使用することを提案しました) –

+0

sedとawk?それはgrepと同じですか? – Suezy

+0

@Suezy btw、私はこの質問がServerFault.comに属しているという事実を指していました。残念ながら、私はそれが上に移動するために投票する評判が強くないが、いくつかのSO - GNOMEは私のためにそれを行う可能性があります。 –

答えて

4

この単純な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) 

幸運を。

+0

ありがとうございます! =)私はそれを試してみる。少なくとも私はPerlでプログラミングする方法を知っている。 – Suezy

+0

私はこれが歳であることを知っています...あなたの正規表現の問題は、0.0.0.0に続いてIPアドレスが付いたものと一致します。つまり、ゲートウェイが0.0.0.0であれば、genmaskが返されます。具体的には、「G」フラグはゲートウェイを示す。 'echo $(route -n | perl -ne 'print m/0.0.0.0 \ s +([0-9] +。[0-9] +。[0-9])このようなものは、 +。[0-9] +)\ s + 0.0.0.0 \ s + \ wG/g ') 'netstat -nr'と' route -n'の間に違いはありません – user1106405

0

あなたは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

このアプローチの基本的な点は、 regexp、あなたの望むフィールドを得るためのカット。しかし、他の人が投稿したようにawkを使うことはできますが、私はまだその言語を習得していません。 – maxwellb

+0

@maxwelb 'awk'で' grep'は必要ありません。例: 'netstat -rn | awk '/^0\.0\.0\.0\./ {print $ 2}' 'と入力します。 –

49

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

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

複数のデフォルトゲートウェイがある場合はどうなりますか?あなたのスクリプトは私に '192.168.1.1 192.168.0.1'を返します。これは本当です。私はインターネットに2つのゲートウェイを持っています。しかし、主なものは '192.168.1.1'です。最初の 'default'値をメイン(優先的)値として選択すべきですか? –

+1

@SopalajodeArrierez私の意見では、関心のある特定のインターフェイスのゲートウェイを選択する必要があります。 '/ sbin/ip route | grep '^ default' | awk '/ eth1/{print $ 3}' 'を使って、' eth1'のゲートウェイを知りたいときに使用します。 –

+0

...実際、私はそれを自分の答えとして投稿します。 –

1

もうperlの事:

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

注:ipの前との後にこれらのバッククックを使用してください以下

0

useコマンド:

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}' 
3

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

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

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

+0

ゲートウェイが設定されていない場合、0.0.0.0が表示されます。ゲートウェイが設定されている場合、これは機能しません。 – yogur

0

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

28

iproute2パッケージからip routeコマンドは、選択を行うために、awk/grepなどを使用することなく、ルートを選択することができます。複数のデフォルトゲートウェイの場合

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

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

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

(おそらく多くの)デフォルトの経路を選択する

、どのいずれかを選択することができ特定の宛先アドレスへの次のホップとして選択されます。あなたはその後、ここなど、sed/awk/grepを使用して値を抽出することができ

$ 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 

bashread組み込みを使用した一例です。すべてのLinux上

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

私はipが既に正しい行を出力しているので、これが好きです。それに基づいて少し改善されたバージョンは次のとおりです: 'ip -4 route list 0/0 | cut -d '-f 3' – breiti

1
#!/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 
5

作品:

route -n|grep "UG"|grep -v "UGH"|cut -f 10 -d " " 
+1

'ルート-n | awk '$ 4 == "UG" {print $ 2} "'同じアイデアを使って何かハッキーが少ない –

1

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

traceroute www.google.com 

最初のホップがデフォルトゲートウェイであります。ここすべてデフォルトゲートウェイのリストについては

0

mezgani's answerを使用し、重複(およびやや単純化された):

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

あなたが同時に設定された複数のネットワークインターフェイスを持っている場合、これは複数のゲートウェイを出力します。あなたは、単一のネットワーク - を取るスクリプトを作ることができ

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

:あなたが名前(例えばeth1)によって単一の既知のネットワーク・インタフェースを選択したい場合は、単に^defaultラインのフィルタリングに加えて、そのを検索引数と印刷関連するゲートウェイとしてインタフェース名:

#!/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}" 

コメントで述べたように、これは、より広範なプログラムのコンテキストで有用であり得る顕熱終了コードを設定するという利点を有します。

関連する問題