CUIとVSCodeからUbuntuにSSH接続する方法（GUIも）

## はじめに

Windows(WSLも含む）またはmacOSからUbuntu22.04へLAN内でSSH接続する方法について解説します。以下の4つの方法について解説します。
1. CUIでSSH接続する方法
2. VSCodeを使用してSSH接続する方法
3. パスワードなしでSSH接続する方法（CUIとVSCode)
4. X11アプリケーションを表示する方法（CUIとVSCode)

※作成中
SSH接続はLAN内でしかできないですが、TailScaleというVPNサービスを使えば、LAN外でSSH接続できます。
利用方法は、SSH接続の際のIPアドレスをTailScaleのアドレスに変えるだけなので、とても楽です。
セットアップもサーバーとクライアントでログインして、接続するだけでした！
なんとなくで利用できるので、ぜひ試してみてください！
時間があるときに説明を書きます！

https://tailscale.com


## 共通

1. サーバPCのIPアドレスを確認する
サーバ（Ubuntu 22.04）で以下のコマンドをターミナルから実行し、IPアドレスを調べます。
    ```bash
    ip a
    ```
2. リモートログインの有効化
サーバPCで「設定」→「共有」→「リモートログイン」をONにします。

3. OpenSSHのインストール
    OpenSSHをインストールします。システムを最新の状態にし、OpenSSHをインストールしてください。
    ```
    sudo apt update && sudo apt upgrade
    sudo apt install openssh-server
    ```
    インストールが完了したら、OpenSSHを有効にします。
    次のコマンドを実行してください。
    ```
    sudo systemctl enable --now ssh
    ```

## CUIでSSH接続する方法
1. クライアントPCでターミナルを開きます。
2. 以下のコマンドを実行して、サーバPCへ接続します。
    ```bash
    ssh {USER_NAME}@{IP_ADDRESS}
    ```
    * `USER_NAME`：サーバのユーザー名
    * `IP_ADDRESS`：サーバのIPアドレス
3. Ubuntuのアカウントパスワードを入力してログインします。

## VSCodeを使用した方法
### 準備
1. **拡張機能のインストール**  
   VSCodeに「Remote - SSH」拡張機能をインストールします。

   ![Remote - SSH 拡張機能](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734306/5a36208c-fdc2-bdac-f53a-540ad02e93a2.png)

2. **SSH設定ファイルの編集**  
   - `Ctrl+Shift+P` を押してコマンドパレットを開きます。
   - 「Remote-SSH: SSH 構成ファイルを開く」を選択します。
   - configファイルに以下の設定を追加します。

     ```bash
     Host 任意のホスト名
         HostName {IP_ADDRESS}
         User {USER_NAME}
     ```

### 接続手順
1. VSCodeの左下にある「><」のマークをクリックし、「ホストに接続する」を選択します。

   ![ホストに接続する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734306/5fafac4f-d399-0ed8-3224-1fbf1bbb4eb7.png)

2. 表示されるホスト名から接続先を選択します。
3. Ubuntuのログインパスワードを入力すると接続が完了します。

---

## パスワード無しで接続する方法

SSH鍵を利用することで、毎回パスワードを入力する手間を省くことができます。

### SSH鍵の作成
1. クライアントPCで以下のコマンドを実行します。

   ```bash
   ssh-keygen -t rsa -b 4096 -C "your-email@example.com"
   ```

2. 公開鍵（`id_rsa.pub`）をサーバに登録します。

#### 公開鍵の登録方法
- 方法1（Windows＆WSL＆macOS）

   以下のコマンドを順に実行します。

   ```bash
   scp ~/.ssh/id_rsa.pub {USER_NAME}@{IP_ADDRESS}:~/
   ssh {USER_NAME}@{IP_ADDRESS}
   mkdir -p ~/.ssh
   cat id_rsa.pub >> ~/.ssh/authorized_keys
   rm ~/id_rsa.pub
   ```

- 方法2（WSL＆macOS）
   ```bash
   ssh-copy-id -i ~/.ssh/id_rsa.pub {USER_NAME}@{IP_ADDRESS}
   ```

    設定が完了したら以下のコマンドでパスワード無しで接続できるか確認します。

   ```bash
   ssh USER_NAME@IP_ADDRESS
   ```
    ※Remote - SSH拡張機能はWindowsのsshを使用しています。そのため、WSLの公開鍵をサーバーにコピーしても、VSCodeのRemote - SSH拡張機には反映されないことに注意してください。

## X11アプリケーションを表示する方法（-XYオプション）
X11アプリケーションを表示する方法について解説します。

WindowsからUbuntu 22.04のX11アプリケーション（GUI）を表示するには、SSH接続時に`-X`または`-Y`オプションを使用します。以下に手順を説明します。

### 前提条件
 **クライアント側の準備**  
   Windows上でX11サーバ（例：XmingやVcXsrv）をインストールし、起動しておきます。   macOSの場合はXQuartzでできます。

※追記
VcXsrvの設定では、「Disable access control」にチェックを入れる必要があります。これは、すべてのクライアントからのX11接続を許可する設定であり、セキュリティ上のリスクがあります。
本来であれば特定のIPアドレスだけに許可を与えるべきですが、VcXsrv自体にはIPアドレスによるアクセス制限機能が存在せず、また、Windows環境にはUnixの `xhost`コマンドのようにX11アクセスを細かく制御する手段も標準では備わっていません。
現時点では、利便性を優先してこの設定を使用していますが、より安全な代替手段が見つかれば、適宜更新いたします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734306/d3d35470-c6e4-4a65-9635-04073c34cf81.png)


---

### CUIでの接続方法
* 方法1（Windows＆macOS）
1. ターミナルを開きます。
2. `-X`または`-Y`オプションを付けてSSH接続します。
   ```bash
   ssh -X {USER_NAME}@{IP_ADDRESS}
   ```

   - `-X`：X11転送を有効にします。
   - `-Y`：信頼済みのX11転送を有効にします。（セキュリティのリスクが低い環境で推奨）
3. 接続後DISPLAYの設定をします。（クライアント側のIPアドレスであることに注意してください）
    ```
    export DISPLAY={CLIENT_IP_ADDRESS}:0.0
    ```

4. X11アプリケーションを起動します。例として、`xclock`を実行します。
   ```bash
   xclock
   ```

5. 正常に動作していれば、クライアント側の画面にアプリケーションのウィンドウが表示されます。
* 方法2(WSL)
1. `-X`または`-Y`オプションを付けてSSH接続します。
   ```bash
   ssh -X {USER_NAME}@{IP_ADDRESS}
   ```
2. X11アプリケーションを起動します。例として、`xclock`を実行します。
   ```bash
   xclock
   ```
3. 正常に動作していれば、Windowsの画面にアプリケーションのウィンドウが表示されます。
---

### VSCodeでの使用方法
VSCodeのRemote - SSHでX11転送を有効にするには、SSH構成ファイルに以下を追加します。

1. `config`ファイルを編集します。
   ```bash
   Host 任意のホスト名
       HostName {IP_ADDRESS}
       User {USER_NAME}
       ForwardX11 yes
       ForwardX11Trusted yes
   ```

2. Remote - SSHで接続します。
3. ターミナルでX11アプリケーションを起動します（例：`xclock`）。

※Remote - SSH拡張機能はWindowsのsshを使用しています。そのため、WSLの公開鍵をサーバーにコピーしても、VSCodeのRemote - SSH拡張機には反映されないことに注意してください。

---

この設定により、Windows上でUbuntuサーバのGUIアプリケーションを表示できるようになります。

## 注意事項

- **SSH機能の対応バージョン** 
  VScodeのSSH接続はx86_64であればUbuntu 16.04以降、AArch64であればUbuntu18.04以降でサポートされています（2024年12月時点）。
- **XサーバでGUI表示する際macOSだと表示できないアプリケーションがある**
    ParaviewやRvizの表示をすると、以下のようなエラーを吐き表示できませんでした。
    ```
    libGL error: No matching fbConfigs or visuals found
    libGL error: failed to load driver: swrast
    ```
    [2.7.8にダウングレード](https://bugs.freedesktop.org/show_bug.cgi?id=96433)すれば動くとありました。しかしこれを行うと、そもそもSSH接続ができなくなりました。2016年と情報が古い情報だったので、他の依存ソフトの影響で対処できなくなったのかもしれません。もし、解決方法があれば更新します。
---

## 参考資料

- [Visual Studio Code で Remote SSH する。#VSCode - Qiita](https://qiita.com/nlog2n2/items/1d1358f6913249f3e186)
- [研究室などの Ubuntu Desktop を複数ユーザで使う。#Ubuntu22.04 - Qiita](https://qiita.com/KaoruHosokawa00/items/c4c9b5a71eb0c86a2277)
- [Remote - SSH](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh)
---