2017-06-08 2 views
-3

この質問は最近インタビューで尋ねられました。与えられたサブネットをあらかじめ定義された数の小さなサブネットに細分するためのbashスクリプトを書く

質問:所定のサブネットをあらかじめ定義された数の小さなサブネットに細分するためのbashスクリプトを作成します。

分割後のIPアドレスを無駄にするべきではありません。つまり、分割したサブネットを累積して分割したサブネットを構成する必要があります。

すべてのサブネットには、3つのIPアドレスが予約されており、ホストでは使用できません(ネットワーク、ブロードキャスト、ゲートウェイ)。

ネットワーク/ブロードキャストアドレス、ホスト数を表示し、ゲートウェイを割り当てます。ゲートウェイは、分割されたサブネットで最初に使用可能なIPである必要があります。例:

INPUT:./subnetter.sh 192.168.0.0/24 3

OUTPUT:

subnet=192.168.0.0/25 network=192.168.0.0 broadcast=192.168.0.127 gateway=192.168.0.1 hosts=125 
subnet=192.168.0.128/26 network=192.168.0.128 broadcast=192.168.0.191 gateway=192.168.0.129 hosts=61 
subnet=192.168.0.192/26 network=192.168.0.192 broadcast=192.168.0.255 gateway=192.168.0.193 hosts=61 

INPUT:./subnetter.sh 192.168.0.0/24 4

OUTPUT:

subnet=192.168.0.0/26 network=192.168.0.0 broadcast=192.168.0.63 gateway=192.168.0.1 hosts=61 
subnet=192.168.0.64/26 network=192.168.0.64 broadcast=192.168.0.127 gateway=192.168.0.65 hosts=61 
subnet=192.168.0.128/26 network=192.168.0.128 broadcast=192.168.0.191 gateway=192.168.0.129 hosts=61 
subnet=192.168.0.192/26 network=192.168.0.192 broadcast=192.168.0.255 gateway=192.168.0.193 hosts=61 

INPUT:./subnetter.sh 10.55.10.64/28 2

OUTPUT:すべての

subnet=10.55.10.64/29 network=10.55.10.64 broadcast=10.55.10.71 gateway=10.55.10.65 hosts=5 
subnet=10.55.10.72/29 network=10.55.10.72 broadcast=10.55.10.79 gateway=10.55.10.73 hosts=5 

まず、私はサブネットを分割するために使用されているもののロジックを分析しようとしています。 第2に、私は出力を得るためにipcalcコマンドを使用しようとしていますが、運はありません。

おかげで

+3

は、SOコードの書き込みはありませんが、SO、あなたのコーディングの努力を表示してくださいへようこそサービス。 – Cyrus

+0

私はこの問題についてお手伝いしますが、 '192.168.0.0/24 3 'の最初の出力には同意しません。しかし、最後の2つの出力は良いです – RomanPerekhrest

+0

@RomanPerekhrest私は質問への答えが比較的簡単な分裂征服の再帰アルゴリズムであることを意図していると思われます:入力を2つの部分に分割し、さらに細分化する。 a/24の3つの部分への最も均等な分割は、85,85、および86のアドレスからなり、最初の85のアドレスは/ 26、a/28、a/30およびa/32で記述されます。 – chepner

答えて

0

私は、スクリプトをオフ必要なものの70%を行っていると信じています。あなたはipcalcを使っていたので、同様のバイナリを使うことに専念しました。

yum Linux OSのディストリビューションに応じてRPMベースのOSまたはapt-get install sipcalcをお持ちの場合は、sipcalcをインストールしてください。

次に、次のスクリプトを作成し、subnetter.shとして保存し、実行可能にするために「x」権限を与えます。私のスクリプトの

#!/bin/bash 
 

 
if [ $# == 0 ]; then 
 
echo "Usage: ./subnetter.sh IP/SUBNET RANGE" 
 
exit 
 
fi 
 

 
subnet=$1 
 
network=`echo $subnet | cut -d/-f1` 
 
broadcast=`/usr/bin/sipcalc $1 | grep -i broadcast | cut -d '-' -f2` 
 
gateway=`/usr/bin/sipcalc $1 | grep -i usable | awk '{print $4}'` 
 
hosts=`/usr/bin/sipcalc $1 | grep -i addresses | cut -d '-' -f2` 
 

 
echo "subnet =" $subnet "network =" $network "broadcast =" $broadcast "gateway =" $gateway "hosts =" $hosts

出力:

[[email protected] ~]# ./subnetter.sh 192.168.0.0/24 
 
subnet = 192.168.0.0/24 network = 192.168.0.0 broadcast = 192.168.0.255 gateway = 192.168.0.1 hosts = 256

第三引数の要件は非常にシンプルで、簡単に使用して行うことができることに注意してくださいforループ。私はあなたがそれをすることを期待する。

あなたの出力が正しいことを確認するために、次のツールを使用することができます

http://www.subnet-calculator.com/subnet.php?net_class=C

よろしく、

ロハンDsouza

0

私は上記のrequirmentを経て、以下、私がプログラムされているものであるしていますその結果を達成する。

のPythonコードは、既存のサブネットのサブサブネットを作成し、その後、ループの動作を実行するシェルスクリプトを呼び出すし、提供し、ユーザーがコードの下

を期待される結果を達成するために、上記シェルスクリプトと統合ユーザーの要求に基づいたレコード。

from netaddr import * 
import ipaddress 
import csv 
import subprocess 
import os 
import shlex 
import sys 
import numpy as np 
from itertools import islice 


if os.path.exists('hst.txt'): 
    os.remove('hst.txt') 
else: 
    print("Sorry, I can not remove ") 

if os.path.exists('hst_refined.txt'): 
    os.remove('hst_refined.txt') 
else: 
    print("Sorry, I can not remove ") 




fd = open('store_subnet',"w") 
enter_subnet = raw_input('Enter subnet please: ') 
fd.write(enter_subnet) 


fd = open('store_sub_subnet',"w") 
sub_subnet = raw_input('Enter nested_subet_count: ') 
fd.write(sub_subnet) 





ip=ipaddress.ip_network(unicode(enter_subnet)) 


list_demo = list(ip.subnets(int(sub_subnet))) 

for i in list_demo: 
    hs = open("hst.txt","a") 
    hs.write(str(i)) 
    hs.write("\n") 
    hs.close() 



p = subprocess.Popen([ "/home/ramkumar5/network_cal/report_demo.sh" ], stdout=subprocess.PIPE).communicate()[0] 
for i in p: 
    hs = open("hst_refined.txt","a") 
    hs.write(i) 
    hs.close() 



print(sub_subnet) 




records_req = raw_input('Enter Number of Records needed: ') 
f=open("hst_refined.txt") 
for i in xrange(int(records_req)): 
    line=f.next().strip() 
    print line 
f.close() 
# #

CODE2

#!/bin/bash 

for res in `cat hst.txt` ; do 

subnet=$res 
network=`echo $subnet | cut -d/-f1` 
broadcast=`/usr/bin/sipcalc $res | grep -i broadcast | cut -d '-' -f2` 
gateway=`/usr/bin/sipcalc $res | grep -i usable | awk '{print $4}'` 
hosts=`/usr/bin/sipcalc $res | grep -i addresses | cut -d '-' -f2` 

echo "subnet =" $subnet "network =" $network "broadcast =" $broadcast "gateway =" $gateway "hosts =" $hosts 

done 

Sample Out from the result ###

関連する問題