MSYS2 with OpenSSH SSH Server on Windows 11

# Windows 11のOpenSSH SSH ServerでMSYS2を起動する

## 環境
 - Windows 11 & Windows Terminal
 - MSYS2 msys2-base-x86_64-20230127

## OpenSSH SSH Serverインストール
以下のメニューから"機能を追加する" ボタンを押す。

```
設定 -> アプリ -> オプション機能 -> オプション機能を追加する
```

以下の2つの機能を追加する。OpenSSH クライアントは、接続テストに利用する。

 - OpenSSH サーバー
 - OpenSSH クライアント

## OpenSSH SSH Server起動
機能を追加しても自動では起動しないので、メニューから起動する。

```
コントロールパネル -> Windowsツール -> サービス
```

OpenSSH SSH Serverのプロパティを開き、以下を設定する。

 - スタートアップの種類：自動に変更する
 - サービスの状態：開始ボタンを押す

## OpenSSH SSH Clientによる接続確認
Microsoftアカウントでログインした状態で接続する。
パスワードはPINではなくMicrosoftアカウントのパスワードを入力する。

```
C:\Users\xxxxx>ssh localhost
The authenticity of host 'localhost (::1)' can't be established.
ED25519 key fingerprint is SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'localhost' (ED25519) to the list of known hosts.
xxxxx@localhost's password:
Microsoft Windows [Version 10.0.22621.1265]
(c) Microsoft Corporation. All rights reserved.

xxxxx@VOSTRO C:\Users\xxxxx>
```

SSHで接続している状態ではプロンプトに接続先のPC名が表示されるようになる。

## 公開鍵認証
一度exitコマンドでsshを切断し、ホストに戻ってから作業する。

```
C:\Users\xxxxx>ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\xxxxx/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\xxxxx/.ssh/id_ed25519
Your public key has been saved in C:\Users\xxxxx/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:9nTPpYudvaaTzLBcNxAwU0fpYT0dlFrblOm2iirM1j8 xxxxx@VOSTRO
The key's randomart image is:
+--[ED25519 256]--+
|           +o.o=O|
|            o..X+|
|              B.=|
|             o =.|
|        S . . o o|
|       . o o + * |
|      o . o B B .|
|       = . E O = |
|      . ..o.o.B.o|
+----[SHA256]-----+

C:\Users\xxxxx>
```

typeコマンドで公開鍵の中身を表示し、クリップボードにコピーしておく。（反転させてEnterを押す）

```
C:\Users\xxxxx>type .ssh\id_ed25519.pub
ssh-ed25519 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX xxxxx@VOSTRO
```

### authorized_keys編集
公開鍵の内容をauthorized_keysに張り付ける。

ここで、非管理者ユーザーの場合は ```C:\Users\xxxxx\authorized_keys``` に張り付ける。

管理者ユーザーの場合は ```C:\ProgramData\ssh\administrators_authorized_keys``` に張り付ける。
管理者ユーザーの場合でも任意のテキストエディタで ```administrators_authorized_keys``` に張り付けて保存しようとすると、アクセス権が無くて保存できない場合がある。その場合はNotepadを管理者権限で起動して編集するとよい。

authorized_keysを編集後、再度SSHで接続し、パスワードを省略して接続できるか確認する。

```
C:\Users\xxxxx>ssh localhost
Microsoft Windows [Version 10.0.22621.1265]
(c) Microsoft Corporation. All rights reserved.

xxxxx@VOSTRO C:\Users\xxxxx>
```

ローカルホストからの接続を確認後、他のホストから接続できるか確認する。

## MSYS2インストール
### ダウンロード
以下のMSYS2のサイトからアーカイブをダウンロードする。

```
https://github.com/msys2/msys2-installer/releases
```

今回は ```msys2-base-x86_64-20230127.tar.xz``` を利用する。

### 展開
tarおよびxzは以下のtexinstwinに含まれる実行ファイルを利用すると良い。

```
http://ftp.jaist.ac.jp/pub/CTAN/systems/win32/w32tex/texinstwin.zip
```

```
> tar xJvf msys2-base-x86_64-20230127.tar.xz
```

展開後、```msys64``` フォルダが作成されるので、```C:\msys64``` に配置する。

### /etc/fstab修正
複数のバージョンのMSYS2をインストールしてもhomeを共有できるように、C:\msys2\etc\fstabに以下を追記する。

```
C:/home	/home	ntfs	binary,auto 0 0
C:/opt	/opt	ntfs	binary,auto 0 0
```

### 初回起動
```C:\msys64\msys2_shell.cmd``` をダブルクリックする。



```
Copying skeleton files.
These files are for the users to personalise their msys2 experience.

They will never be overwritten nor automatically updated.

'./.bashrc' -> '/home/xxxxx/.bashrc'
'./.bash_logout' -> '/home/xxxxx/.bash_logout'
'./.bash_profile' -> '/home/xxxxx/.bash_profile'
'./.inputrc' -> '/home/xxxxx/.inputrc'
'./.profile' -> '/home/xxxxx/.profile'
'C:\WINDOWS\system32\drivers\etc\hosts' -> '/etc/hosts'
'C:\WINDOWS\system32\drivers\etc\protocol' -> '/etc/protocols'
'C:\WINDOWS\system32\drivers\etc\services' -> '/etc/services'
'C:\WINDOWS\system32\drivers\etc\networks' -> '/etc/networks'
gpg: /etc/pacman.d/gnupg/trustdb.gpg: trustdb created
gpg: no ultimately trusted keys found
gpg: starting migration from earlier GnuPG versions
gpg: porting secret keys from '/etc/pacman.d/gnupg/secring.gpg' to gpg-agent
gpg: migration succeeded
==> Generating pacman master key. This may take some time.
gpg: Generating pacman keyring master key...
gpg: directory '/etc/pacman.d/gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/etc/pacman.d/gnupg/openpgp-revocs.d/312C95AE6ABE15852630D5827A50DBC420E74D12.rev'
gpg: Done
==> Updating trust database...
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
==> Appending keys from msys2.gpg...
==> Locally signing trusted keys in keyring...

中略

###################################################################
#                                                                 #
#                                                                 #
#                   C   A   U   T   I   O   N                     #
#                                                                 #
#                  This is first start of MSYS2.                  #
#       You MUST restart shell to apply necessary actions.        #
#                                                                 #
#                                                                 #
###################################################################

xxxxx@VOSTRO MSYS ~
$

```

exitで終了し、再度 ```C:\msys64\msys2_shell.cmd``` をダブルクリックする。

### パッケージインストール

アップデートするパッケージが無くなるまで ```pacman -Syu``` を繰り返す。
```
$ pacman -Syu
```

アップデート後、適宜パッケージをインストールする。

```
$ pacman -S --needed vim
```

### ユーザー名変更
Microsoft Accountでログインしていると、ユーザー名が自動的に設定されて変更できない。
mkpasswdコマンドを利用して ```/etc/passwd``` を作成し、任意のユーザー名に変更する。
1列目のユーザー名と最後から２列目のhomeを変更すると良い。

```
$ mkpasswd -c > /etc/passwd
$ vim /etc/passwd
```

```/etc/passwd``` を変更後、ターミナルを再起動する。


### デフォルトシェルの変更
サーバ側でPowerShellを管理者権限で起動し、以下の記事を参考にしてデフォルトシェルを ```C:\msys64\usr\bin\bash.exe``` に変更する。

https://qiita.com/kenji0x02/items/3f4e7262e6de0d8c8702


```
PS C:\WINDOWS\system32> New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\msys64\usr\bin\bash.exe" -PropertyType String -Force


DefaultShell : C:\msys64\usr\bin\bash.exe
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE
PSChildName  : OpenSSH
PSDrive      : HKLM
PSProvider   : Microsoft.PowerShell.Core\Registry



PS C:\WINDOWS\system32>
```

SSHでサーバに接続し、bashが起動することを確認する。

デフォルトシェルを ```cmd.exe``` に戻すときは以下のコマンドを管理者権限のPowershellで実行する。

```
Set-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\cmd.exe" -Force
```

再度 bash に変更するときは PropertyType オプションは不要となる。
```
Set-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\msys64\usr\bin\bash.exe" -Force
```

## HOME変更
sshで接続するとmsys2のbashが起動するが、homeが ```C:\Users\xxxxx``` になっている。(WindowsのSSHDに接続しているためと思われる）

```C:\Users\xxxxx\.bashrc``` に以下を追記し、HOMEを変更してシェルを再起動させる。

```
export HOME=/home/$USER
exec $SHELL -l
```

以降は ```C:\Users\xxxxx\.bashrc``` ではなく、```/home/xxxxx/.bashrc``` を修正する。

## tmux
tmuxをインストールする。

```
$ pacman -S --needed tmux
```

tmuxを起動すると、```open terminal failed: not a terminal``` というエラーが発生する。

```
# tmux
open terminal failed: not a terminal
```

調査の結果、以下のコメントにある以下のコードを ```.bashrc``` に追加するとtmuxを起動できるようになった。

https://github.com/alacritty/alacritty/issues/1687


```
tmux () {
    TMUX="command tmux ${@}"
    SHELL=/usr/bin/bash script -qO /dev/null -c "eval $TMUX";
}
```