Linuxでテキストファイルに記載された内容を用いてコマンドを作成する
株式会社テイクーワン D.Zです。
同じコマンドを別のパラメータで複数回実行する必要がある場合、人によってやり方は色々あると思いますが、私はパラメータを記載したテキストファイルからawk等を用いてコマンドを作成し、確認した後に一括実行することが多いです。
今回は私自身がよく使うやり方を実例を踏まえて書いてみます。
楽したいけど失敗を減らしたい人向け。コンセプトは「難しいコマンドは使わ(え)ない」です。
要件
今回は下記の要件で進めていきます。
- 要件:複数のスタティックルートをインターフェース名「enp0s3」に登録する
- サーバのIP:10.0.2.15/24
- テキストファイル名:route.txt
- テキストファイルに記載している登録対象の情報(サブネット,ゲートウェイ)
# cat route.txt
192.168.100.0/24,10.0.2.100
192.168.10.0/24,10.0.2.50
172.16.0.0/16,10.0.2.100
作成するコマンドの動作確認
作成するコマンドが正しく動作・設定出来るか、事前に確認します。
コマンドの作成
まずはroute.txtの1行目のパラメータを使ったスタティックルート登録用コマンドをcheck.shに作成します。
# cat check.sh
nmcli connection modify enp0s3 +ipv4.routes "192.168.100.0/24 10.0.2.100"
コマンド実行前のルート設定確認
コマンド実行前のルート設定を確認します。
# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default _gateway 0.0.0.0 UG 100 0 0 enp0s3
10.0.2.0 0.0.0.0 255.255.255.0 U 100 0 0 enp0s3
コマンドの実行
作成したコマンドを実行します。
# bash -x ./check.sh
+ nmcli connection modify enp0s3 +ipv4.routes '192.168.100.0/24 10.0.2.100'
設定の反映
設定したスタティックルートをインターフェースに反映します。
# nmcli connection up enp0s3
接続が正常にアクティベートされました(D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/8)
コマンド実行後のルート設定確認
コマンド実行後のルート設定を確認します。正常に登録できることが確認できたのでコマンドの書き方は正しいと判断します。
# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default _gateway 0.0.0.0 UG 100 0 0 enp0s3
10.0.2.0 0.0.0.0 255.255.255.0 U 100 0 0 enp0s3
192.168.100.0 10.0.2.100 255.255.255.0 UG 100 0 0 enp0s3 ←追加されている。
設定の削除
設定したスタティックルートを削除します。
# nmcli connection modify enp0s3 -ipv4.routes "192.168.100.0/24 10.0.2.100"
# nmcli connection up enp0s3
接続が正常にアクティベートされました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/9)
# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default _gateway 0.0.0.0 UG 100 0 0 enp0s3
10.0.2.0 0.0.0.0 255.255.255.0 U 100 0 0 enp0s3
テキストファイルから複数のコマンドを作成
作成するコマンドが確認できたので、route.txtに記載されたパラメータから登録用コマンドを作成します。
awkを使ってroute.txtからコマンドを作成する
タイトル通り、awkを使ってroute.txtからコマンドを作成して、add_route.shにリダイレクトします。
awkの使い方は世の中にたくさん公開されていますので、そちらをご覧ください。
# awk -F, '{print "nmcli connection modify enp0s3 +ipv4.routes \""$1" "$2"\""}' route.txt > add_route.sh
# cat add_route.sh
nmcli connection modify enp0s3 +ipv4.routes "192.168.100.0/24 10.0.2.100"
nmcli connection modify enp0s3 +ipv4.routes "192.168.10.0/24 10.0.2.50"
nmcli connection modify enp0s3 +ipv4.routes "172.16.0.0/16 10.0.2.100"
作成したコマンドの比較確認
作成した「add_route.sh」の1行目は事前に確認した「check.sh」と同じになるはずなので、1行目を抽出してdiffで確認します。
# head -1 add_route.sh > check2.sh
# cat check2.sh
nmcli connection modify enp0s3 +ipv4.routes "192.168.100.0/24 10.0.2.100"
# diff -s check.sh check2.sh
ファイル check.sh と check2.sh は同一です
diffで同一と確認できたので、awkで作成したコマンドは特に問題はなさそうです。
「同一です」と表示されない場合は出力を確認して差分が出ないようにawkコマンドを修正し、確認を繰り返します。
作成したコマンドの比較確認
確認した結果が問題なければ作成した「add_route.sh」を実行します。
add_route.shの実行
作成したコマンドを実行します。
# bash -x ./add_route.sh
+ nmcli connection modify enp0s3 +ipv4.routes '192.168.100.0/24 10.0.2.100'
+ nmcli connection modify enp0s3 +ipv4.routes '192.168.10.0/24 10.0.2.50'
+ nmcli connection modify enp0s3 +ipv4.routes '172.16.0.0/16 10.0.2.100'
設定の反映
設定したスタティックルートをインターフェースに反映します。
# nmcli connection up enp0s3
接続が正常にアクティベートされました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/10)
コマンド実行後のルート設定確認
コマンド実行後のルート設定を確認します。
# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default _gateway 0.0.0.0 UG 100 0 0 enp0s3
10.0.2.0 0.0.0.0 255.255.255.0 U 100 0 0 enp0s3
172.16.0.0 10.0.2.100 255.255.0.0 UG 100 0 0 enp0s3
192.168.10.0 10.0.2.50 255.255.255.0 UG 100 0 0 enp0s3
192.168.100.0 10.0.2.100 255.255.255.0 UG 100 0 0 enp0s3
正常に登録できていることが確認できました。
まとめ
記載した内容を大さっぱにまとめると以下の通りです。
- コマンド作成に必要な情報をそろえる(今回はインターフェース名「enp0s3」と「route.txt」)
- 実行するコマンドを確認する
- 必要な情報を用いてコマンドを作成する
- 作成したコマンドが意図したものか確認する
- 作成したコマンドを実行する
泥臭い手順ですが、実行前に確認できることで失敗が減らせられることと実行したコマンド(今回だとadd_route.sh)がファイルを削除するまで残るので、何をやったか後で追いかけるのが容易になるのはメリットかなとも思っています。