vagrantをプロビジョニングするときに、自動で/etc/hosts
に追記(編集)できたら、きっと楽になるはず!!!
vagrantはroot
でプロビジョニングが可能ですが、全ての作業をroot
で作業したくない・・・。
というわけで、/etc/hosts
を例に、所有者がrootのファイルを編集する方法を3つ紹介します。
検証した環境
- Mac
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.11.5
- CentOS(vagrant)
$ cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
手動で/etc/hostsを書き換える時に、sudoが必要な理由
手動で/etc/hosts
を書き換える場合には、先頭にsudo
を付ける必要があります。
$ sudo vim /etc/hosts
/etc/hosts
の所有者を確認すると、root
となっています。
$ ls -la /etc/hosts
-rw-r--r-- 1 root wheel 303 5 30 18:23 /etc/hosts
そのため、ファイルの編集にはroot
権限が必要となります。
sudo
コマンドでは、ユーザの指定を省略すると、**rootユーザ(スーパーユーザ)**による実行とみなされます。
シェルスクリプトで書き換える方法
その1:実行時にsudoをつける
/tmp
配下に適当なシェルスクリプトを作成します。
$ cd /tmp
$ vim test.sh
#!/bin/sh
echo 127.0.0.1 example.com >> /etc/hosts
このスクリプトは、/etc/hosts
に127.0.0.1 example.com
を追記します。
それでは、作成したシェルスクリプトを実行します。
$ sh test.sh
test.sh: line 2: /etc/hosts: Permission denied
しかし、**Permission denied(権限がない)**と怒られます。
先頭にsudo
をつけて実行すると、問題なく成功します。
$ sudo sh test.sh
Password: ← パスワード入力
# 実行結果
$ cat /etc/hosts | grep example.com
127.0.0.1 example.com
その2:シェルスクリプト内で実行するコマンドでrootユーザになる(1)
その1のように、sudo
を付けてシェルスクリプトを実行できる時は、これで問題ありません。
しかし、vagrantのプロビジョニングのように、ある特定の場合のみroot
で実行したい場合、以下の方法が有効です。
$ cd /tmp
$ vim test.sh
#!/bin/sh
sudo -- sh -c "echo '127.0.0.1 example.com' >> /etc/hosts"
sudo -- sh
は、root
ユーザでシェルスクリプトを実行するコマンドとなります。また、-c
オプションを指定することで、文字列(今回はecho
を含む文字列)がコマンドとして読み込まれます。
$ sh test.sh
Password: ← パスワード入力
# 実行結果
$ cat /etc/hosts | grep example.com
127.0.0.1 example.com
127.0.0.1 example.com ← 追記されている
その3:シェルスクリプト内で実行するコマンドでrootユーザになる(2)
コメントしていただいた方法を追記します。
この方法もvagrantのプロビジョニングのように、ある特定の場合のみroot
で実行したい場合、以下の方法が有効です。
$ cd /tmp
$ vim test.sh
#!/bin/sh
sudo sh -c "echo '127.0.0.1 example.com' >> /etc/hosts"
sudo sh
は、その2で紹介した方法の短縮形となります。sudo
コマンドでは、ユーザの指定を省略すると、rootユーザによる実行とみなされるため、この方法でも追記が可能となります。
$ sh test.sh
Password: ← パスワード入力
# 実行結果
$ cat /etc/hosts | grep example.com
127.0.0.1 example.com
127.0.0.1 example.com
127.0.0.1 example.com ← 追記されている
まとめ
今回は、所有者がroot
ユーザのファイル例として/etc/hosts
を紹介しました。
他のファイルにもこの方法は有効です。
また、今回は追記する方法を紹介しましたが、もちろんsed
や他のコマンドも使うことができます。
#!/bin/sh
sudo -- sh -c "sed 's/example/test/g' /etc/hosts"
vagrantのプロビジョンの際には、パスワードを求められないのでroot
権限が必要なファイルのプロビジョニングには有効です。
ぜひ、使ってみてください〜〜〜!