Windows の認証付き共有フォルダを Ubuntu で自動マウント

autofs を使うと特定のディレクトリ以下にアクセスしたときに NFS や CD-ROM を自動マウントすることができます。
更に mount.cifs と組み合わせれば Windows の共有フォルダも自動マウントできます。
Ubuntu の autofs パッケージには auto.smb（シェル スクリプト) が含まれているので
これを利用すればいいのですが、この auto.smb は認証なしの共有フォルダにしか対応していません。
通常、共有フォルダはユーザー名/パスワードによるアクセス制限の設定をしますよね?

というわけで認証付きの共有フォルダをマウントできるように auto.smb を書き換えました。
以下にその手順を書きます。

# パッケージのインストール
Windows 共有フォルダの自動マウントに必要なパッケージをインストールします。

```
apt install cifs-utils smbclient autofs
```

# auto.master
auto.master にエントリを追加します。ここでは Windows 共有フォルダのマウントポイントを /smb にしました。

``` /etc/auto.master
/smb    /etc/auto.smb
```

# 認証ファイル
共有フォルダへのアクセスに必要なユーザー名, パスワード, ドメイン名をファイルに保存します。
パスは /etc/auto.credentials/&lt;Windowsホスト名&gt; にしました。
ディレクトリ名は何でも構いませんが、ファイル名は Windows ホスト名と一致させます。

注意点として "=" の前後にスペースを入れてはいけません。smbclient は問題ないのですが
mount.cifs がファイルの内容を解釈できなくなります。
また、このファイルには認証情報が含まれているので root 以外は読み書き不可にしましょう。

``` sh:/etc/auto.credentials/winsvr
username=ユーザー名
password=パスワード
domain=ドメイン名
```

認証ファイルを使って Windows ホストにアクセスできることを確認します。

```
smbclient -L winsvr -A /etc/auto.credentials/winsvr
```

# auto.smb
Windows ホスト名に対応する認証ファイルがあれば mount.cifs と smbclient にオプションを
追加するように /etc/auto.smb を書き換えます。

auto.smb の $1 には Windows のホスト名が渡されます。たとえば /smb/winsvr/path/to/file に
アクセスしたときは winsvr がセットされます。

opts には mount.cifs のオプションを設定します。マウントしたディレクトリおよびファイルの
アセクス権を設定したいときは uid, gid, file_mode, dir_mode などを opts に追加します。
mount.cifs のオプションの詳細は man mount.cifs を参照して下さい。

``` sh:/etc/auto.smb
#!/bin/bash

# This file must be executable to work! chmod 755!

key="$1"
opts="-fstype=cifs,rw,iocharset=utf8"

credfile=/etc/auto.credentials/$key
smbopts=
if [ -f $credfile ]; then
        opts="$opts,credentials=$credfile"
        smbopts="$smbopts -A $credfile"
fi

for P in /bin /sbin /usr/bin /usr/sbin
do
        if [ -x $P/smbclient ]
        then
                SMBCLIENT=$P/smbclient
                break
        fi
done

[ -x $SMBCLIENT ] || exit 1

$SMBCLIENT -gL $key $smbopts 2>/dev/null| awk -v key="$key" -v opts="$opts" -F'|' -- '
        BEGIN   { ORS=""; first=1 }
        /Disk/  {
                  if (first)
                        print opts; first=0
                  dir = $2
                  loc = $2
                  # Enclose mount dir and location in quotes
                  # Double quote "$" in location as it is special
                  gsub(/\$$/, "\\$", loc);
                  gsub(/\&/,"\\\\&",loc)
                  print " \\\n\t \"/" dir "\"", "\"://" key "/" loc "\""
                }
        END     { if (!first) print "\n"; else exit 1 }
        '
```

auto.smb の動作を確認します。
Windows ホスト名を引数に指定して実行すると mount.cifs のオプションと共有フォルダが表示されることを確認します。

```
# /etc/auto.smb winsvr
-fstype=cifs,ro,iocharset=utf8,credentials=/etc/auto.credentials/winsvr \
         "/share" "://winsvr/share" \
         "/C$" "://winsvr/C\$" \
...
```

# 設定反映
autofs を再起動します。

```
# service autofs restart
```

/smb/&lt;Windowsホスト名&gt;/&lt;共有フォルダ名&gt; 以下にアクセスして Windows 共有フォルダが自動マウントされることを確認します。

```
$ ls -la /smb/winsvr/share
```

# 参考
- [Ubuntu Tips: Fix auto.smb for automount Windows shares. - Nikep's blog]
  (http://www.nikep.net/srdpty/index.php?/archives/87-Ubuntu-Tips-Fix-auto.smb-for-automount-Windows-shares..html)