EC2・Linuxでpreztoを全ユーザで使えるようにする。

# はじめに
[前回の記事](https://qiita.com/sakai00kou/items/11d2c8c3a3ff7a95ca9c)で`zsh`のフレームワークとなる`prezto`を改めて触っていたら`Linux`や`EC2`でも一般ユーザ・root問わずに使えたら便利だなと思いやってみました。

- 【前】[iTerm2でタイムスタンプ付きのログの出力とpreztoのインストールを行う。](https://qiita.com/sakai00kou/items/11d2c8c3a3ff7a95ca9c)

# インストール手順の整理
以下公式の手順だと実行ユーザーのホームディレクトリに`git clone`でソースをダウンロードしてシンボリックリンクを設定するやり方となっていますが、その場合、ユーザを作成するごとに毎回`git clone`で持ってくることになるため、同じソースが散乱し精神衛生上よろしくありません。

そのため、１つのソースを共有しユーザが増えたとしても対応できるようにインストール手順を変更しようと思います。

- [prezto公式ページ](https://github.com/sorin-ionescu/prezto)

元々公式の手順で行っていることは単純なので以下の流れで全ユーザ対応を行います。

今回は`Amazon Linux 2`のEC2インスタンスにインストールする場合を紹介するので、他の`Linux`にインストールする場合は適宜読み替えて対応してください。

- [EC2事前作業](#ec2事前作業)
- [preztoのダウンロード](#preztoのダウンロード)
- [新規ユーザ用設定](#新規ユーザ用設定)
    - [必要ファイルのコピー](#必要ファイルのコピー)
    - [シンボリックリンクの作成](#シンボリックリンクの作成)
    - [テスト用ユーザの作成とプロンプト確認](#テスト用ユーザの作成とプロンプト確認)
- [現行ユーザ用設定](#現行ユーザ用設定)
    - [現行ユーザへの必要ファイルのコピー](#現行ユーザへの必要ファイルのコピー)
    - [現行ユーザへのシンボリックリンクの作成](#現行ユーザへのシンボリックリンクの作成)
    - [現行ユーザのログインシェル変更](#現行ユーザのログインシェル変更)
    - [現行ユーザのプロンプト確認](#現行ユーザのプロンプト確認)

# EC2事前作業
`Amazon Linux 2`のEC2インスタンスにインストールする場合、`zsh`も`git`もインストールされていないので、インストールします。

```bash:zshインストール
sudo yum -y install zsh
```

```bash:gitインストール
sudo yum -y install git
```

# preztoのダウンロード
`prezto`のソースを`git clone`でダウンロードしてきます。

公式ページの手順だと`zsh`に変更してから行っていますが、今回は特に変更する必要はありません。

ダウンロード場所は、ユーザのホームディレクトリではなく、全ユーザと共有するので、`/usr/local/bin`にでもダウンロードしておきます。

また、元ソースとなる`prezto`は隠しファイルにする必要も無いので、「.（ドット）」も外しています。

```bash:preztoのダウンロード
sudo git clone --recursive https://github.com/sorin-ionescu/prezto.git "/usr/local/bin/zprezto"
```

# 新規ユーザ用設定
新規ユーザが追加されたとしても`prezto`が有効になるように以下作業を実施していきます。

## 必要ファイルのコピー
新規作成ユーザもすぐに`prezto`を使えるようにするため、必要なファイルを`/etc/skel`にコピーしておきます。

本来はユーザのホームディレクトリ配下に`prezto`のソースをダウンロードして、ダウンロードソースにシンボリックリンクを作成する方法となりますが、今回は`prezto`のソースを共有しているため、`prezto`の設定に関わる各種ファイルは個々のユーザごとに変更できるよう、設定ファイルをそのままコピーしておきます。

`zsh`インストールにより、`/etc/skel/.zshrc`が作成されているかと思われますが、上書きコピーしてください。

```bash:必要ファイルのコピー
sudo cp /usr/local/bin/zprezto/runcoms/zlogin /etc/skel/.zlogin
sudo cp /usr/local/bin/zprezto/runcoms/zlogout /etc/skel/.zlogout
sudo cp /usr/local/bin/zprezto/runcoms/zpreztorc /etc/skel/.zpreztorc
sudo cp /usr/local/bin/zprezto/runcoms/zprofile /etc/skel/.zprofile
sudo cp /usr/local/bin/zprezto/runcoms/zshenv /etc/skel/.zshenv
sudo cp /usr/local/bin/zprezto/runcoms/zshrc /etc/skel/.zshrc
```

## シンボリックリンクの作成
`prezto`のソースディレクトリへのシンボリックリンクを作成します。

```bash:preztoのソースディレクトリへのシンボリックリンク作成
sudo ln -s /usr/local/bin/zprezto /etc/skel/.zprezto
```

## テスト用ユーザの作成とプロンプト確認
上記で作業を行った`/etc/skel`に各種ファイルの格納とシンボリックリンクを作成しておくことで、新規ユーザ作成時に`/etc/skel`に格納されているファイルが新規ユーザのホームディレクトリにコピーされるので、テスト用のユーザを作成し、`prezto`が使える状態になっているか確認します。

```bash:テスト用ユーザの作成
sudo useradd -s /bin/zsh testuser
```

テスト用ユーザ作成後、テスト用ユーザにログインしてみて、`prezto`のデフォルトプロンプトが表示されればOKです。

```bash:テスト用ユーザへのスイッチ
sudo su - testuser
```

![Monosnap_20230225_173646.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/966e6cb5-1f9b-17e7-858e-78a23b9ad4dc.png)

終わったらテスト用ユーザは削除しておきましょう。

```bash:テスト用ユーザの削除
sudo userdel -r testuser
```

# 現行ユーザ用設定
すでに作成済みの現行ユーザも`prezto`を有効にするために以下作業を実施していきます。

## 現行ユーザへの必要ファイルのコピー
上記までの手順で新規ユーザに対しては`prezto`対応することができましたが、既存のユーザに対しては対応できていないため、先程と同等の作業を現行ユーザに対しても行います。

```bash:必要ファイルのコピー
sudo cp /usr/local/bin/zprezto/runcoms/zlogin /home/ec2-user/.zlogin
sudo cp /usr/local/bin/zprezto/runcoms/zlogout /home/ec2-user/.zlogout
sudo cp /usr/local/bin/zprezto/runcoms/zpreztorc /home/ec2-user/.zpreztorc
sudo cp /usr/local/bin/zprezto/runcoms/zprofile /home/ec2-user/.zprofile
sudo cp /usr/local/bin/zprezto/runcoms/zshenv /home/ec2-user/.zshenv
sudo cp /usr/local/bin/zprezto/runcoms/zshrc /home/ec2-user/.zshrc
cp /usr/local/bin/zprezto/runcoms/zlogin /root/.zlogin
cp /usr/local/bin/zprezto/runcoms/zlogout /root/.zlogout
cp /usr/local/bin/zprezto/runcoms/zpreztorc /root/.zpreztorc
cp /usr/local/bin/zprezto/runcoms/zprofile /root/.zprofile
cp /usr/local/bin/zprezto/runcoms/zshenv /root/.zshenv
cp /usr/local/bin/zprezto/runcoms/zshrc /root/.zshrc
```

## 現行ユーザへのシンボリックリンクの作成
現行ユーザに対してもシンボリックリンクの作成を行います。

```bash:preztoのソースディレクトリへのシンボリックリンク作成
ln -s /usr/local/bin/zprezto /home/ec2-user/.zprezto
sudo ln -s /usr/local/bin/zprezto /root/.zprezto
```

## 現行ユーザのログインシェル変更
設定が終わったので、`root`と`ec2-user`のログインシェルを`bash`から`zsh`に変えておこうと思います。

`Amazon Linux 2`のEC2には`prezto`の公式ページに書かれている`chsh`コマンドが無いので、`usermod`でログインシェルを変更します。

```bash:rootとec2-userのログインシェル変更
sudo usermod -s /bin/zsh ec2-user
sudo usermod -s /bin/zsh root
```

変更したら`/etc/passwd`のログインシェル欄が`/bin/zsh`に書き換わっているか確認します。

```bash:ログインシェル変更の確認
egrep "^root|^ec2-user" /etc/passwd
```

```bash:コマンド結果
root:x:0:0:root:/root:/bin/zsh
ec2-user:x:1000:1000:EC2 Default User:/home/ec2-user:/bin/zsh
```

## 現行ユーザのプロンプト確認
上記までの作業で現行ユーザも`prezto`が使えるようになっているので、プロンプトが変わるかを確認します。

`zsh`と入力し、`prezto`のデフォルトプロンプトが表示されればOKです。

```bash:ec2-userのプロンプト確認
zsh
```

`root`ユーザにも切り替えて`prezto`のデフォルトプロンプトが表示されればOKです。

```bash:rootのプロンプト確認
sudo su -
```

# おわりに
今回は`prezto`の設定と言うよりは`Linux`の知識となりましたが、`.zpreztorc`等の設定ファイルをユーザごとに分けているため、あるユーザはデフォルトの`solin`テーマを使用し、あるユーザは`agnoster`テーマを使用するといったことができるようになりました。

ただし、テーマ自体の設定ファイルは共有ディレクトリ内のファイルとなるため、[前回の記事](https://qiita.com/sakai00kou/items/11d2c8c3a3ff7a95ca9c)で実施したテーマ自体の書き換えを各ユーザごとに行いたいといった場合はさすがに個別に`prezto`をダウンロードする必要がありますが、そのようなレアケースでなければ今回の手順で十分かと思います。