sudo のパスワードを入力なしで使うには

# **はじめに**
Ubuntuでsudoによる操作を行う時に、**いちいちパスワード聞かれてうざいなぁ**って思うこと無いですか？
特に、`find` `locate`とか`apt-get` とか `reboot` `shutdown` みたいに良く使うコマンドだとなおさらだと思います。
そんな時に、**パスワードを入力しなくても済む方法があった**ので、記しておきたいと思います。
尚、本記事を読んで行われた処理や事故に対し、当方は一切の責任を負いませんのであらかじめご了承ください。

# **sudoersファイルとvisudo**
sudoでは、sudoersファイルにより、sudoの管理者権限などを記述しています。  
そこで、これを編集することにより、任意のユーザに対してパスワードを入力することなく、sudoを使用できるようにします。  
ただし、編集に**失敗すると、最悪、sudoが使用できなくなる**ので、慎重に編集しましょう。  
**そして、編集失敗の悲劇を避けるために、visudo`というものが用意されています。**
必ず**visudo**を使用して編集しましょう。
ちなみに、visudoを使うと、仮に間違った文法で記入しても、適用前に色々と確認をとってくれます。  

# **すべてのコマンドのパスワード入力を省略する**
では早速、visudoを使ってsudoersファイルを編集してみましょう。  
以下のコマンドでvisudoを起動してください

```bash
$ sudo visudo
```

もちろん、sudoパスワードを要求されるので、いつもどおり入力してください。  
**sudoパスワードを忘れちゃったよというドジっ子なあなた**は、私の記事[sudoのパスワードを忘れたら...](http://qiita.com/RyodoTanaka/items/0b320e96d40f9c1aefc3)をご覧ください。  
とりあえずsudoパスワードが入力できたとして進めると、以下のような編集画面が開いたと思います。

```vim
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d


^G ヘルプ        ^O 保存          ^R 読み込み      ^Y 前のページ    ^K 切り取り      ^C 位置
^X 終了          ^J 両端揃え      ^W 検索          ^V 次のページ    ^U 貼り付け      ^T スペル確認
```

これを編集することになるのですが、パスワード入力を無効にするには、以下のような要素を新たに入力を行います。

```vim
<username> ALL=NOPASSWD: ALL
```

なので、例えば、ユーザー名が **hoge** さんであれば、

```vim
hoge ALL=NOPASSWD: ALL
```

という感じです。
ところで、薄々感じているとは思いますが、上記の方法だと、**すべてのコマンドがパスワード無しで使えるようになります**。
つまり、ユーザーが乗っ取られてしまうと、**やりたい放題されてしまいます。**
それぐらい強力な設定になってしまうので、**上記の方法はあまりおすすめしません**。
それでも。。。という方は、**自分の責任の範疇での行動をおねがいします。**

# **一部のコマンドのみ、パスワード入力を省略する**
というわけで、一部のコマンドの時のみパスワードの入力を省略する方法を紹介します。  
具体的には、例えば、 ***shutdown*** のコマンドを入力するときだけ、パスワード入力を省略したいとすると、以下のようにshutdownバイナリ本体の場所をNOPASSWDの対象にしてやれば良いということです。

```vim
hoge ALL=NOPASSWD: /sbin/shutdown
```

というわけで、**visudo**を起動したところから具体的な話を進めます。例えば、**hoge**さんが、**shutdown**と**reboot**のコマンドの時のみパスワード入力を省略するには、以下のように、sudoersファイルを編集してやれば良いことになります。

```vim
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL
hoge	ALL=NOPASSWD: /sbin/shutdown
hoge	ALL=NOPASSWD: /sbin/reboot

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d


^G ヘルプ        ^O 保存          ^R 読み込み      ^Y 前のページ    ^K 切り取り      ^C 位置
^X 終了          ^J 両端揃え      ^W 検索          ^V 次のページ    ^U 貼り付け      ^T スペル確認
```

編集し終わったら、Ctrl-Xで保存し、終了しましょう。  
上の例の場合でうまく行っていたら、特に何も表示されず、次回以降、hogeさんは、shutdownとrebootだけ、パスワードを聞かれることなく、sudoで実行することができるようになります。 

# **visudoを使ってsudoersファイルの編集に失敗した場合**(visudoを使っていること前提)
はじめに にも書いていますが、sudurersファイルの編集に失敗すると、sudoが使えなくなります。
そこで、visudoを使った時に、編集に失敗した場合にどうなるか記しておきたいと思います。 
もちろん、編集した段階では、失敗に気づいていません。つまり、Ctrl-Xを押して、保存し、終了したところまでは同じです。
意気揚々とEnterキーを「ッターンッ」ってすると以下のようなエラーが出ていると思います。

```bash
>>> /etc/sudoers: syntax error near line 28 <<<
次は何でしょうか? 
```

visudoってすごいですね。**文法の間違いを指摘してくれます**。
と言っても、次はどうすればよいのでしょうか？  
ここで、もう一度Enterを押すと、先ほどに続いて以下のような表示が出たはずです。

```bash
>>> /etc/sudoers: syntax error near line 28 <<<
次は何でしょうか? 
オプション:
  e -- sudoers ファイルを再度編集します
  x -- sudoers ファイルへの変更を保存せずに終了します
  Q -- sudoers ファイルへの変更を保存して終了します (*危険です!*)

次は何でしょうか? 
```

迷わずeを入力し、間違いの箇所を訂正しましょう。  
因みに、今の例では、rebootについての記述箇所に間違いがありました。

```vim
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL
hoge	ALL=NOPASSWD: /sbin/shutdown
hoge	ALL=NOPASWD: /sbin/reboot

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d


^G ヘルプ        ^O 保存          ^R 読み込み      ^Y 前のページ    ^K 切り取り      ^C 位置
^X 終了          ^J 両端揃え      ^W 検索          ^V 次のページ    ^U 貼り付け      ^T スペル確認
```

確かに、28行目が間違っている ！  
というわけで、これを変更してもう一度Ctrl-Xを押して保存し、終了しましょう。  
このように、visudoを使えば、安全にsudoersファイルを編集することができます。


# **参考**
http://www.sadaji.net/Firmware/BBB/eclipse/auto_sudo.htm
http://wiki.ubuntulinux.jp/UbuntuTips/Others/RootSudo

# **検証環境**
| | | |
| :---: | :---------: | :---: |
| **PC** | Lenovo ThinkPad X240 |
| **Prosessor** |Intel Core i7-4600U (2.10GHz, 4MB, 1600MHz) |
| **RAM** | PC3-12800 DDR3L (8GB) |
| **OS** | Ubuntu 14.04 LTS 64bit |
| **Kernel** | 3.13.0-44-generic |